我是 mock 新手,所以我正在尝试这个场景。我有一个调用 MyClass.getFactory()
的方法 MyClass.process()
。我想模拟 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());
}
}
}
最佳答案
我将扩展@Can't Tell已经说过了。您使用模拟库来模拟被测类的依赖关系。在您的情况下,您测试 MyClass
,并且在测试期间您应该模拟所有依赖项(MyClass
使用的类)。
您想要模拟一个类中的单个方法并测试另一个方法。虽然这在技术上可能是可行的(但由于各种代理/包装机制,它不适合您),但这肯定是一个糟糕的设计。
向我们展示您的 getFactory()
方法。如果它单独处理整个工作,请将其提取到一个单独的类并模拟它。如果它只委托(delegate)给另一个类,请模拟该类。遗憾的是,这个提取的类将被命名为... MyFactoryFactory
...
提取依赖项后,在测试之前模拟它并传递给 MyClass
(通过构造函数、setter...)
关于java - Mockito 我如何模拟这个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12661989/