我在模拟一个方法(使用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
的实例)。