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

Java 测试包含接口调用的抽象类的具体方法,java,junit,mockito,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(Mock

我有一门课:

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;
}

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


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

您好,很不幸,我无法使用set():/您可以将客户端的访问类型更改为protected而不是private吗?您好,我的问题在于intarface调用。不是抽象的。关于,您如何在创建的
foo
实例中设置
foobarclient
?我认为
Mockito
运行程序不支持
@Inject
注释。要么显式设置它,要么使用
@InjectMocks
I modified
code
@Mock private FoobarClient FoobarClient;模仿。我调用了实现,而不是接口,但是现在Mockito.when(…)不匹配。关于,@InjectMocks将是
foo
上的注释,而不是
FooBarClient
。我建议只做
foo.foobarclient=foobarclient或调用setter方法。使用Spring的ReflectionTestUtils进行设置。
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();