Mockito的麻烦

时间:2014-06-18 18:02:27

标签: java junit mockito

我今天开始摆弄Mockito并且经历了相当大的挣扎,希望有人可以把我拉直。

基本上我想要做的就是验证我的getName()方法中的3个方法是否被调用。

出于某些原因,虽然在我的测试中,每当我点击这一行:

Mockito.verify(mock).getPathObj();

我最终收到此错误: "想要但未被调用:   mock.getPathObj();"

这是我想测试的课程

public class JavaFileInput {

private Path path;

public JavaFileInput(){
    super();
    this.path = null;
}

public Path getPathObj() {
    return this.path;
}

@Override
public String getName() {
    Path path = getPathObj(); //<--I realize I could just use my path member var here.  Added for troubleshooting.
    return path.getFileName().toString();
}
}

这是我的测试类

public class TestJavaFileInput {

@Mock(name = "path") private Path path;
@InjectMocks private JavaFileInput mock = Mockito.mock(JavaFileInput.class);

@Before
public void testSetup(){
    MockitoAnnotations.initMocks(this);
}

@Test
public void getNameTest(){
    mock.getName();
    Mockito.verify(mock).getName();
    Mockito.verify(mock).getPathObj();
}
}

有人对我有一些见解吗?

我已经用尽了这些资源,但我想我可以轻易忽略一些事情: http://www.vogella.com/tutorials/Mockito/article.html http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#21

3 个答案:

答案 0 :(得分:2)

首先,你不应该嘲笑你要测试的课程。只模拟您需要的外部依赖项。

其次,您需要指定何时调用该方法的行为。你的Path实例应该返回什么?这是模拟进入的地方,因为您需要决定在调用getFileName()时返回什么。

when(path.getFileName()).thenReturn(Paths.get("file://some/uri"));

答案 1 :(得分:1)

Mockito只为您提供模拟对象。默认情况下,调用模拟上的任何方法都不会做任何事情。因此,当您致电getName时,没有任何事情发生,并且getPathObj未被调用。您可以尝试使用spycallRealMethod,但我从不使用它,因为似乎不推荐(代码闻起来 ...)在mockito documentatin中。

答案 2 :(得分:1)

单元测试验证对象如何与其环境进行交互,而不是自身。

在你的情况下,环境是path

假设您可以将Path模拟注入对象,则需要执行以下操作:

JavaFileInput input = new JavaFileInput();
when(path.getFileName()).thenReturn("xxx.txt");
// inject path into input somehow
assertEquals("xxx.txt", input.getName());

如果你不能注射path,那就是代码味道。考虑重新设计。