我今天开始摆弄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
答案 0 :(得分:2)
首先,你不应该嘲笑你要测试的课程。只模拟您需要的外部依赖项。
其次,您需要指定何时调用该方法的行为。你的Path
实例应该返回什么?这是模拟进入的地方,因为您需要决定在调用getFileName()
时返回什么。
when(path.getFileName()).thenReturn(Paths.get("file://some/uri"));
答案 1 :(得分:1)
Mockito只为您提供模拟对象。默认情况下,调用模拟上的任何方法都不会做任何事情。因此,当您致电getName
时,没有任何事情发生,并且getPathObj
未被调用。您可以尝试使用spy
或callRealMethod
,但我从不使用它,因为似乎不推荐(代码闻起来 ...)在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
,那就是代码味道。考虑重新设计。