嘲笑例外

时间:2014-09-23 06:25:29

标签: java unit-testing mockito junit4

我有一些问题嘲弄一个方法(使用mockito),这取决于输入参数返回一个String或异常。

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

感谢您的帮助

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());
        }

    }

}

1 个答案:

答案 0 :(得分:2)

您正在创建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的实例)。