【发布时间】:2012-09-30 14:29:30
【问题描述】:
我是嘲笑的新手,所以我正在玩这个场景。我有一个方法MyClass.process() 调用MyClass.getFactory()。我想模拟 getFactory() 失败,以便我可以确保 process() 正确恢复。
似乎如果我在模拟之后调用getFactory(),它会正确抛出异常,但如果通过原始process() 方法调用,则不会抛出异常。
public class MyClass {
public MyFactory getFactory() throws FactoryException {
return ...
}
public String process() {
try {
MyFactory factory = getFactory();
...
}
catch(FactoryException ex) {
...
}
}
}
测试类:
public class MyClassTest {
@Test
public void testGetFactoryFails() {
try {
MyClass mockMyClass = mock(MyClass.class);
when(mockMyClass.getFactory()).thenThrow(new FactoryException());
mockMyClass.process();
fail("FactoryException should have been thrown.");
}
catch(FactoryException ex) {
// all good
}
}
}
感谢所有反馈。我可以看到在更复杂的环境下模拟单个方法会很快变得难以管理。 getFactory() 的内容并不重要,因为这是概念代码,而不是生产代码。
我尝试过的一种效果很好的方法:
public class MyClassTest {
class MyClassMock1 extends MyClass {
@Override
public MyFactory getFactory() throws FactoryException {
throw new FactoryException("Bad factory instance.");
}
}
@Test
public void testGetFactoryFails() {
try {
MyClassMock1 mockMyClass = new MyClassMock1();
mockMyClass.process();
fail("FactoryException should have been thrown.");
}
catch(FactoryException ex) {
assertEquals("Bad factory instance.", ex.getMessage());
}
}
}
【问题讨论】:
-
您正在模拟对象上调用 process 方法。使用 Mockito 时,您可以模拟要模拟的类的依赖项,而不是模拟类。
-
你能解释一下这是什么意思吗?
-
能否把getFactory的内容贴出来,让我看看它在什么情况下会抛出异常,以便我解释一下?
标签: java unit-testing junit mocking