![](/img/trans.png)
[英]@Mock MessageSource always returns null for getMessage in Junit test
[英]Why my mock test always pass for method which returns null but must return String
我正在测试以检查方法是否返回正确的字符串。 但是,即使方法返回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; }
}
myClass.get()
返回testObj.get()
; 同时,使用when(...)
指示testObj.get()
返回test
。
因此myClass.get()
基本上等同于test
,而Assert.assertTrue(myClass.get().equals(test))
Assert.assertTrue(test.equals(test))
为Assert.assertTrue(test.equals(test))
,当test
不为null
时,断言ok(并且在您的情况下不为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
变量引入),因此代码更易于理解。
正如其他人所解释的那样-首先请仔细阅读您所使用的概念。
这里的关键:你在嘲笑你的测试类的该实例。 因此,返回null的方法的实际实现根本不重要。 因为您创建了一个模拟对象并指示Mockito在调用get()时返回非null值。 因此,返回null的真实方法主体永远不会在您显示给我们的代码中执行。
这就是全部。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.