Java 模仿例外
我在模拟方法(使用mockito)时遇到一些问题,该方法根据输入参数返回字符串或异常 单元测试的代码似乎是错误的,但即使问过谷歌,我也找不到解决方案 谢谢你的帮助Java 模仿例外,java,unit-testing,mockito,junit4,Java,Unit Testing,Mockito,Junit4,我在模拟方法(使用mockito)时遇到一些问题,该方法根据输入参数返回字符串或异常 单元测试的代码似乎是错误的,但即使问过谷歌,我也找不到解决方案 谢谢你的帮助 public class MyClassTest { public MyClass mc; public ClassUnknown cu; @Before public void setUp() { mc = new MyClass(); cu = mock(C
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 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
的实例上调用main方法()。此方法创建另一个ClassUnknown
实例并使用它。因此,ClassUnknown
的模拟实例从未在此处使用过,也从未参与测试
您需要做的是将ClassUnknown
的模拟实例传递给您正在测试的MyClass
实例(或您正在测试的方法):
这就是所谓的依赖注入。拥有可测试的代码至关重要MyClass
取决于ClassUnknown
。所以MyClass不会创建自己的依赖项。相反,您将依赖项(即ClassUnknown
)注入MyClass
谢谢。我添加以向SetUp()中添加一个抛出异常,否则IDE会将该类标记为错误,但不会起作用。是否确实需要将抛出添加到SetUp()中?
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());
}
}
}
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.
}