我正在为方法编写一个JUnit测试用例。
方法
class A extends B {
public execute() {
String id = getContext().getid().toString();
}
}
getContext()
方法在类B
中定义。
如何模拟getContext()
?
答案 0 :(得分:1)
这取决于B
如何获取上下文,这里没有显示。
希望您正在使用Depenedncy Injection / IoC,B
如下:
abstract class B {
private final Context context;
public B(Context context) {
this.context = context;
}
}
然后将模拟上下文注入到您的测试中,只需将其传递到构造函数中即可:
public class ATest {
@Test
public void testExecute() {
// arrange
Context mockContext = mock(Context.class);
when(mockContext.getId()).thenReturn(...);
A a = new A(mockContext);
// act
String ret = a.execute()
// assert
assertThat(ret).isEqualTo(...);
}
}
在这种情况下,您可以做的一件事就是创建A
的子类以进行测试。
这比上面的DI方法更混乱,所以您应该更喜欢它。
public class ATest {
private final Context mockContext = mock(Context.class);
@Test
public void testExecute() {
// arrange
when(mockContext.getId()).thenReturn(...);
A a = new OpenA(mockContext);
// act
String ret = a.execute()
// assert
assertThat(ret).isEqualTo(...);
}
private class OpenA extends A {
@Override
protected Context getContext() {
return mockContext;
}
}
}
答案 1 :(得分:0)
您可以spy:
public BTest {
@Spy
private B underTest;
@Test
public void testSomething() {
doReturn(new MySpeicalContext()).when(underTest).getContext();
// Testing code...
}
}