我在模拟方法时遇到一些问题(使用模仿),该方法根据输入参数返回String或异常。

单元测试的代码似乎是错误的,但是即使在询问Google之后我也找不到解决方案。

谢谢你的帮助

public class MyClassTest
{
    public MyClass mc;
    public ClassUnknown cu;

    @Before
    public void setUp()
    {
        mc = new MyClass();
        cu = mock(ClassUnknown.class);
        // The next two lines seems to be wrong
        when(cu.methodUnknown("hello")).thenReturn("hello there");
        when(cu.methodUnknown("???")).thenThrow(new Exception("don't know"));
    }

    @Test
    public void testMain()
    {

        mc.mainMethod("hello");
        .....;
    }
}


这是“ classUnknown”:

public class ClassUnknown
{
    public String methodUnknown(String s) throws Exception
    {
         // The real logic is much more complex and does some CRUD operations
        if (s.equals("Hello"))
        {
            return "Hello there";
        }
        throw new Exception("don't know");
    }
}


以及要测试的课程:

public class MyClass
{

    public void mainMethod(String s)
    {
        ClassUnknown cu = new ClassUnknown();

        try
        {
            String methodUnknown = cu.methodUnknown(s);
            System.out.println(methodUnknown);
        } catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }

    }

}

最佳答案

您正在创建MyClass的实例。然后,您将创建一个ClassUnknown的模拟实例。然后,您在mainMethod()实例上调用MyClass。此方法创建ClassUnknown的另一个实例并使用它。因此,在任何地方都不会使用ClassUnknown的模拟实例,也不会参与测试。

您需要做的是将ClassUnknown的模拟实例传递给您正在测试的MyClass实例(或您正在测试的方法):

public class MyClass {

    private ClassUnknown cu;

    public MyClass(ClassUnknown cu) {
        this.cu = cu;
    }

    public void mainMethod(String s) {
        try {
            String methodUnknown = cu.methodUnknown(s);
            System.out.println(methodUnknown);
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

...

@Before
public void setUp() {
    cu = mock(ClassUnknown.class);
    // The next two lines seems to be wrong
    when(cu.methodUnknown("hello")).thenReturn("hello there");
    when(cu.methodUnknown("???")).thenThrow(new Exception("don't know"));

    mc = new MyClass(cu); // Now, the MyClass instance will use the mock.
}


这称为依赖注入。拥有可测试的代码至关重要。 MyClass取决于ClassUnknown。因此,MyClass不会创建自己的依赖项。而是将依赖项(即ClassUnknown的实例)注入到MyClass中。

08-18 00:24