【问题标题】:When to use when() in Mocktio何时在 Mockito 中使用 when()
【发布时间】:2015-10-28 08:23:55
【问题描述】:

我正在使用 JUnit 和 Mockito 编写单元测试。假设我有以下测试类:

@Mock(name="myService")
private myServiceClass myService;

@InjectMocks
private myClassIWantToTest classUnderTest;

final myModelClass myModel = new myModelClass();

@Before
private void setUp(){
    MockitoAnnotiations.initMocks(this);
}

@Test 
private void testSomething(){
    myModel.setCode("someCode");

    final MyDataClass myData = new MyDataClass();
    myData.setCode("someCode");

    doReturn("someCode").when(myModel.getCode());
    doReturn(myModel).when(myService.getModelByCode("someCode"));

    assertEquals(classUnderTest.getDataByCode(eq("someCode")), myData);
    verify(myService.getModelByCode(eq("someCode")), atLeastOnce());
}

我的classUnderTest 中的getDataByCode 方法将模型转换为数据,它应该具有相同的代码。对我来说有点模糊的是单元测试应该从所有依赖项中封装classUnderTest。但现在我有一个问题。我使用 setter 方法 myDatamyModel 来设置一个值。问题是我在其中为myModel 放了一个DoReturn,但问题是,它不是注入的Mock。不幸的是,我尝试测试的方法没有字段,它在方法内部初始化它,所以我无法真正解决它。

主要的是,当 myModel 的设置器不再起作用时,我上面显示的测试将不再起作用。我想我有三个问题:

  1. 我需要多难隔离测试类?我不需要为 assertEquals 使用设置器吗?

  2. 是否有另一种方法来处理在我要测试的方法中初始化的对象?处理此类问题的最佳方法是什么?

  3. 另外,什么是构建这个的好模式?我目前在测试方法中初始化我预期的 myData 结果。问题是这是一个相当简短和简单的示例,但我有一些类,其中有大量的对象和方法。

【问题讨论】:

    标签: java unit-testing testing junit mockito


    【解决方案1】:

    听起来您的主要问题是您要测试的课程的设计。但之前有几件事:

    myModel.setCode("someCode");
    doReturn("someCode").when(myModel.getCode());
    

    这没有意义。这不是一个模拟,所以这样做......什么时候在这里没有意义。如果它是一个 mock,调用 setter 将毫无用处。

    assertEquals(classUnderTest.getDataByCode(eq("someCode")), myData);
    

    也很奇怪。你想调用getDataByCode,为什么是eq?去做吧。叫它。写:

    assertEquals(classUnderTest.getDataByCode("someCode"), myData);
    

    Mockito-Matchers 在您想要验证某事但通常不将它们用作实际方法调用的参数时非常有用。

    verify(myService.getModelByCode(eq("someCode")), atLeastOnce());
    

    这段代码真的可以编译吗?不应该是……

    verify(myService, atLeastOnce()).getModelByCode(eq("someCode"));
    

    因此,尽可能地实际隔离单元测试是个好主意。您在测试中邀请的外部问题越少,测试就越好。

    不幸的是,我尝试测试的方法没有字段,它 在方法内部初始化它,所以我无法真正解决它。

    这听起来像是代码异味,但如果没有实际的代码,就很难说...

    【讨论】:

    • 谢谢。是的,实际代码的结构不是很好。但你说的,我的意思。由于 myModel 不是一个 mock,所以使用 doReturn 是没有意义的。但是不建议调用 setter-method,因为我的单元测试依赖于它。 eq-part 你是对的,我试图简化这个例子,所以我在那里犯了一个小错误。 verify-method 没问题,因为 getModelByCode() 返回的是 Model 而不是 void-method。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多