2014-06-18 163 views
1

我今天已经开始修补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

+0

您并未测试真正的JavaFileInput实例。您正在测试JavaFileInput的模拟。这是没有意义的。根据定义,模拟对象的方法除了告诉他们要做的事之外别无它物。 –

回答

2

首先,你不应该嘲笑你想测试的类。只模拟你需要的外部依赖。

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

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

诚和其他人回应, 非常感谢!我无法相信我现在感觉有多愚蠢。我甚至没有理解我试图嘲笑我想测试的那个班的事实。感谢您的所有回应,我现在有一个有效的测试运行。 再次感谢大家! – Chiefwarpaint

1

唯一的Mockito让你模拟对象。默认情况下,在模拟上调用任何方法都不会做任何事情。所以当你拨打getName什么也没有发生,并且getPathObj没有被调用。你可以尝试使用spycallRealMethod,但我从来没有使用它,因为它似乎不推荐(代码味道 ...)在mockito documentatin中。

1

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

在你的情况下,environmwent是path

假设你可以注入一个模拟的路径到你的目标,你需要做的是:

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

如果不能注入path,这是一个代码味道。考虑重新设计。