我正在努力检查方法是否返回正确的字符串。但是,即使方法返回null
,测试也会通过!为什么会发生?编写测试的正确正确?谢谢!
// TestMyObj.java: My test class
public class TestMyObj {
@InjectMocks
private MyClass myClass;
@Mock
TestObj testObj;
private final String test = "test";
@Before
public void setup() {
MockitoAnnotations.initMocks(this); // or use mockito runner
}
@Test
public void test() {
when(testObj.get()).thenReturn(test);
Assert.assertTrue(myClass.get().equals(test));
verify(testObj).get();
}
}
// MyClass.java: Class which uses my object
public class MyClass {
private TestObj testObj;
public MyClass() {}
public MyClass(TestObj testObj) { this.testObj = testObj; }
String get() { return testObj.get(); }
}
// TestObj.java: My testing object
public class TestObj {
String get() { return null; }
}
正如其他人所解释的那样 - 首先仔细阅读您使用的概念。
这里的关键因素:您是模拟测试类的实例。因此,返回零的方法的真实实施根本无关紧要。因为您创建一个模拟的对象并指示Mockito在to Get()的呼叫时返回非零值。因此,在您向我们显示的代码中,从未执行真正的方法主体返回null。
这就是全部。
myClass.get()
返回 testObj.get()
;同时,使用when(...)
,您指示您的testObj.get()
返回test
。
因此, myClass.get()
基本上等同于 test
,而 Assert.assertTrue(myClass.get().equals(test))
降低到 Assert.assertTrue(test.equals(test))
,当 test
不是 null
时,它声称确定确定(并且在您的情况下不是 null
)。
顺便说一句,而不是
Assert.assertTrue(expected.equals(actual));
写作要好得多
Assert.assertEquals(expected, actual);
它将为您提供有关失败的诊断消息,您将看到您的预期值和第二个参数的实际价值。
所以我会重写相同的测试,例如
@Test
public void test() {
when(testObj.get()).thenReturn("test");
assertEquals("test", myClass.get());
verify(testObj).get();
}
这似乎很有意义:我们正在测试MyClass
正确调用其协作者testObj
并将其退货值返回给我们。
使用常数代替test
变量似乎是正确的。首先,由于常数用于两条相邻线,因此"我在一个地方更改了常数,而忘记在另一个地方进行操作"。其次,现在没有间接级别(使用test
变量引入),因此代码更容易理解。