我已经开始学习JUNIT了。 这是我想要实现的目标。 我有一个类来检查inputString是否是secretKey的一部分;
public class StringChecker {
public boolean isEqual(String name)
{
boolean isEqual = false;
if(getSecretKey().contains(name))
{
isEqual = true;
}
return isEqual;
}
public String getSecretKey()
{
return "OSKAR";
}
}
我的测试类就是这个
public class RandomCheck {
@Test
public void isEqualTest()
{
StringChecker stringChecker = mock(StringChecker.class);
when(stringChecker.getSecretKey()).thenReturn("james");
//assertEquals(true, new StringChecker().isEqual("OSKAR")); <----this test case passes
assertEquals(true, stringChecker.isEqual("james"));
}
}
当我使用Mocked对象时,它没有给我预期的结果,因此未通过测试。但是当我使用真实物体时,它会给我预期的结果并通过测试。 我错过了什么吗?像任何注释一样
答案 0 :(得分:2)
mockito mock是一个具有模拟类接口的对象,但不是它的实现。您的StringChecker
已被模拟,这意味着您没有实施代码从isEqual
拨打getSecretKey
。
您可以使用mockito spy
,请参阅this SO question:
Mockito.spy()是一种创建部分模拟的推荐方法。原因是它保证对正确构造的对象调用实际方法,因为你负责构造传递给spy()方法的对象。
答案 1 :(得分:1)
ROOKIE MISTAKE
这是我所做的新秀错误(由Arnold提及)。
我嘲笑了StringChecker类,但我没有提供任何实现 isEqual(String)方法。
因为没有实现,我得到了默认值。在这种情况下 false (返回类型的方法是布尔值)。
解决方案
使用静态方法spy()。 (@Arnold再次提及) 所以这是我的工作代码的样子。
@Test
public void isEqualTest()
{
StringChecker stringChecker = new StringChecker();
StringChecker spy = spy(stringChecker);
when(spy.getSecretKey()).thenReturn("james"); // providing implementation for the method
assertEquals(true, spy.isEqual("james"));
}
我从中学到了什么。
如果你打算使用模拟对象的方法(简单来说,提供实现)来模拟对象的方法,只是通过模拟对象不能完成任务。
TIP
如果要查看模拟对象返回的默认值,只需在sysout中调用模拟对象的方法(不给出实现)。
希望它会帮助像我这样的人。和平
答案 2 :(得分:0)
另一种没有模拟和其他测试用例的方法:
@Test
public void isEqualTest() {
StringChecker stringChecker = new StringChecker() {
@Override
public String getSecretKey() {
return "james";
}
};
assertTrue(stringChacker.isEqual("james"));
assertTrue(stringChacker.isEqual("jam"));
assertTrue(stringChacker.isEqual("mes"));
assertFalse(stringChacker.isEqual("oops"));
}
BTW,isEqual()
可以简化为一行:
public boolean isEqual(String name) {
return getSecretKey().contains(name);
}