java - Mockito 我如何模拟这个方法?

标签 java unit-testing junit mocking

我是 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/

相关文章:

java - 将元素添加到java中的iterable

java - 在不使用多线程的情况下 Ping 多个 IP 地址

java - 验证 void 方法调用

android - Mockk spky 抛出 NoClassDefFoundError

java - 在 Selenide/Selenium 中模板定位器的正确方法是什么?

java - junit类中的顺序

java - Magento Shopgram 结帐页面

java - 特定于字符集的字符在 IDE 中有效,但在实时中无效

reactjs - 如何使用 Jest 正确模拟 React Navigation 的 getParam 方法

java - 使用 jMockit 模拟 JDBC 的 Connection#prepareStatement 总是返回 null