2014-10-30 75 views
0

一个抽象类的具体方法我有一个类:测试包含接口调用

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

回答

0

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

+0

你好,我的问题是在infaceface调用。不在摘要中。 问候, – 2014-10-30 13:05:52

+0

你如何在你创建的'foo'实例中设置'foobarclient'?我不认为支持'@ Inject'注释的'Mockito'跑步者。要么明确地设置它,要么使用'@InjectMocks' – 2014-10-30 13:10:48

+0

我修改了'code' @Mock private FoobarClient foobarClient;到@InjectMock。我调用实现而不是界面,但现在Mockito.when(....)不匹配。问候, – 2014-10-30 13:50:01

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(); 
+0

你好, 不幸的是我不能使用set():/ – 2014-10-30 13:02:09

+0

你可以改变访问类型为受保护的而不是私人的客户端? – StuPointerException 2014-10-30 13:12:45

+0

不,我不能。问候, – 2014-10-30 13:50:46