我在模拟方法时遇到一些问题(使用模仿),该方法根据输入参数返回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
中。