elasticsearch,mockito,Java,Generics,Testing,elasticsearch,Mockito" /> elasticsearch,mockito,Java,Generics,Testing,elasticsearch,Mockito" />

Java 使用when+时出现Mockito和泛型问题;然后返回

Java 使用when+时出现Mockito和泛型问题;然后返回,java,generics,testing,elasticsearch,mockito,Java,Generics,Testing,elasticsearch,Mockito,关于这个问题,我在网上查阅了很多,但我发现没有一个解决方案适合我 我有一个测试类,以及我尝试测试的服务 在测试类中: public class ElasticSearchSearchServiceImplTest{ @InjectMocks private ElasticSearchSearchServiceImpl elasticSearchSearchService = new ElasticSearchSearchServiceImpl(); private SearchMyListC

关于这个问题,我在网上查阅了很多,但我发现没有一个解决方案适合我

我有一个测试类,以及我尝试测试的服务

在测试类中:

public class ElasticSearchSearchServiceImplTest{

@InjectMocks
private ElasticSearchSearchServiceImpl elasticSearchSearchService = new ElasticSearchSearchServiceImpl();

private SearchMyListCriteria searchMyListCriteria;

private SearchHitListCriteria searchHitListCriteria;

private SearchFieldLimitsCriteria searchFieldLimitsCriteria;

private SearchDetailCriteria searchDetailCriteria;

private SearchBrowseCriteria searchBrowseCriteria;

@Mock
private SearchRequestBuilder searchRequestBuilder;

@Mock
private SecurityService securityService;

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Client client;

@Mock
private ListenableActionFuture<SearchResponse> listenableActionFuture;

@BeforeMethod
public void setup() throws InterruptedException
{
    MockitoAnnotations.initMocks(this);
    SearchResponse sr = new SearchResponse();
    Mockito.when(client.prepareSearch(Mockito.anyString())
            .setQuery(Mockito.any(QueryBuilder.class))
            .addFields(Mockito.anyObject())
            .setFrom(Mockito.anyInt())
            .setSize(Mockito.anyInt())
            ).thenReturn(searchRequestBuilder);
    Mockito.when(securityService.isAccountabilityEnabled()).thenReturn(false);

    Mockito.when(searchRequestBuilder.execute()).thenReturn(listenableActionFuture);
    Mockito.when(listenableActionFuture.actionGet()).thenReturn(sr);

    searchMyListCriteria = buildSearchCriteriaBase();
    searchHitListCriteria = buildSearchHitListCriteria();
    searchFieldLimitsCriteria = buildSearchFieldLimitsCriteria();
    searchDetailCriteria = buildSearchDetailCriteria();
    searchBrowseCriteria = buildSearchBrowseCriteria();
}

@Test
public void testDoMyListSearch()
{
    SearchResponse searchResponse = new SearchResponse();
    Boolean execOk = false;
    try {
        searchResponse = elasticSearchSearchService.doMyListSearch(searchMyListCriteria);
        Assert.assertNotNull(searchResponse);
        execOk = true;
    }catch (Exception e){
        e.printStackTrace();
    }
    Assert.assertTrue(execOk);
}
我在网络上尝试了大多数解决方案,但似乎没有任何效果。如果你有什么建议,我很感激


问候

您是否尝试将测试减少到导致测试失败的最小代码段

你认为这是泛型的问题。如果是这样,那么像下面这样简单的事情也会失败:

@Mock
private ListenableActionFuture<SearchResponse> listenableActionFuture;

@BeforeMethod
public void setup() throws InterruptedException {
    MockitoAnnotations.initMocks(this);
    SearchResponse sr = new SearchResponse();
    Mockito.when(listenableActionFuture.actionGet()).thenReturn(sr);
}

@Test
public void testDoMyListSearch() {
    SearchResponse sr = listenableActionFuture.actionGet();
}
@Mock
私有ListenableActionFuture ListenableActionFuture;
@预处理法
public void setup()引发InterruptedException{
initMocks(this);
SearchResponse sr=新的SearchResponse();
Mockito.when(listenableActionFuture.actionGet())。然后返回(sr);
}
@试验
public void testDoMyListSearch(){
SearchResponse sr=listenableActionFuture.actionGet();
}
是吗?我猜不是。。我认为这更可能是由于深存根,以及深存根返回的模拟与您在
然后返回的模拟类型相同的事实。我想知道是否有必要使用
thenReturn
,或者深存根是否能让它“神奇地”工作

无论如何,我的建议是不断缩小空间,找出问题所在。此外,删除不必要的内容,如
searchDetailCriteria
,将有助于人们理解代码并帮助您更快


(抱歉,我更愿意发表评论,但声誉不够)。

我认为客户端会为某些方法调用返回SearchRequestBuilder。因此,您可能需要模拟SearchRequestBuilder。在存根客户端之前,您可以尝试添加以下内容吗

@BeforeMethod
public void setup() throws InterruptedException
{
MockitoAnnotations.initMocks(this);
SearchResponse sr = new SearchResponse();

SearchRequestBuilder requestBuilder = mock(SearchRequestBuilder.class, RETURNS_DEEP_STUBS);
when(client.prepareSearch(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.setQuery(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.addFields(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.setFrom(Matchers.anyInt())).thenReturn(requestBuilder);
when(requestBuilder.setSize(Matchers.anyInt())).thenReturn(requestBuilder);

MockitoAnnotations.initMocks(this);
SearchResponse sr = new SearchResponse();
Mockito.when(client.prepareSearch(Mockito.anyString())
        .setQuery(Mockito.any(QueryBuilder.class))
        .addFields(Mockito.anyObject())
        .setFrom(Mockito.anyInt())
        .setSize(Mockito.anyInt())
        ).thenReturn(searchRequestBuilder);

看起来您使用的是mockito的1.x版本。你能试试2.x版本吗?我试过了,但无论版本如何,我仍然会有相同的错误。我会删除标记testng并添加标记elasticsearch,因为可能会有其他使用elasticsearch的人遇到这种情况problem@FacundoHernánLieby我不明白这个异常怎么会是相同的,因为Mockito 2.1使用的是Byte budy而不是cglib。
@Mock
private ListenableActionFuture<SearchResponse> listenableActionFuture;

@BeforeMethod
public void setup() throws InterruptedException {
    MockitoAnnotations.initMocks(this);
    SearchResponse sr = new SearchResponse();
    Mockito.when(listenableActionFuture.actionGet()).thenReturn(sr);
}

@Test
public void testDoMyListSearch() {
    SearchResponse sr = listenableActionFuture.actionGet();
}
@BeforeMethod
public void setup() throws InterruptedException
{
MockitoAnnotations.initMocks(this);
SearchResponse sr = new SearchResponse();

SearchRequestBuilder requestBuilder = mock(SearchRequestBuilder.class, RETURNS_DEEP_STUBS);
when(client.prepareSearch(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.setQuery(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.addFields(Matchers.any())).thenReturn(requestBuilder);
when(requestBuilder.setFrom(Matchers.anyInt())).thenReturn(requestBuilder);
when(requestBuilder.setSize(Matchers.anyInt())).thenReturn(requestBuilder);

MockitoAnnotations.initMocks(this);
SearchResponse sr = new SearchResponse();
Mockito.when(client.prepareSearch(Mockito.anyString())
        .setQuery(Mockito.any(QueryBuilder.class))
        .addFields(Mockito.anyObject())
        .setFrom(Mockito.anyInt())
        .setSize(Mockito.anyInt())
        ).thenReturn(searchRequestBuilder);