测试包含接口调用的抽象类的具体方法

时间:2014-10-30 12:25:29

标签: java junit mockito

我有一个班级:

public abstract class Foo{
  @Inject
  private FooBarClient foobarclient;

  public abstract long dofoo1();
  public abstract long dofoo2();

  public void doBar1(){
    foobarClient.docall(faa);
  }

}

我想测试doBar1()方法,所以我像这样制作了我的测试类:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

private Foo foo;

@Mock
private FoobarClient foobarClient;

@Before
public void init() {
    foo = new Foo() {
        dofoo1(){};
    };
}

@Test
public void testControleValiditeSite() throws Exception {
    // G
    Response response=....;
    Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
            response);
    // W
    foo.doBar1();
    // T;
}

但是我在doBar1()中的fooBarclient上得到了一个空指针异常。

我还尝试用以下方式模拟摘要:

Foo foo = Mockito.mock(Foo,Mockito.CALLS_REAL_METHODS);

有没有更好的方法来进行此测试?

编辑:

我用过反射。现在代码如下:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

private Foo foo;

@Mock
private FoobarClient mockedFoobarClient;

@Before
public void init() {
    foo = new Foo() {
        dofoo1(){};
    };
    **MockitoAnnotations.initMocks(this);**
    **ReflectionTestUtils.setField(foo , "foobarClient", mockedFoobarClient);**
}

@Test
public void testControleValiditeSite() throws Exception {
    // G
    Response response=....;
    Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
            response);
    // W
    foo.doBar1();
    // T;
}

2 个答案:

答案 0 :(得分:1)

您可能不需要模拟它,只需在测试中创建一个实例(假设您能够将客户端的访问类型从private更改为protected)。

Foo foo = new Foo() {
    @Override
    public long dofoo1() {
        return 0;
    }

    @Override
    public long dofoo2() {
        return 0;
    }

    public void setClient(FooBarClient client) {
        foobarclient = client;
    }
};

foo.setClient(client);
foo.doBar1();

答案 1 :(得分:0)

在您的测试类中,创建一个扩展Foo的非抽象内部类。在测试中使用它。