我有一些问题嘲弄一个方法(使用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());
}
}
}
答案 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
的实例)。