MockedObject和Real Object提供不同的结果

时间:2017-08-06 04:48:44

标签: java junit mocking mockito

我已经开始学习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对象时,它没有给我预期的结果,因此未通过测试。但是当我使用真实物体时,它会给我预期的结果并通过测试。 我错过了什么吗?像任何注释一样

3 个答案:

答案 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);
}