嘲笑一个例外



我在模拟一个方法(使用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());
        }
    }
}

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

您需要做的是将ClassUnknown的mock实例传递给您正在测试的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.        
}

这就是所谓的依赖注入。拥有可测试的代码是至关重要的。CCD_ 9依赖于CCD_。因此MyClass不会创建自己的依赖项。相反,您在MyClass内部注入依赖项(即ClassUnknown的实例)。

相关内容

  • 没有找到相关文章

最新更新