gpt4 book ai didi

java - 一个模拟类工作正常,另一个返回 null

转载 作者:行者123 更新时间:2023-11-28 21:15:38 25 4
gpt4 key购买 nike

我在我的一个单元测试中模拟 2 个类,使用 Mockito 定义行为。何时调用函数。

其中一个模拟类完全按预期工作,另一个返回 null。我不知道这两者之间有什么区别。

QueryServiceTest.java

@Import({ QueryServiceTestConfig.class })
@RunWith(SpringRunner.class)
public class QueryServiceTest {

@Autowired
private QueryService queryService;
@MockBean
private ElasticConnectionService elasticConnectionService;
@MockBean
private HBaseConnectionService hbaseConnectionService;

@Test
public void test_getRecordsFromQuery() throws IOException {

// creation of sample data for inputs and outputs goes here

// This mock works when called from queryService.getRecordsFromQuery()
when(elasticConnectionService.getRowIdsFromQuery(filterParams, testIndex)).thenReturn(getRowIdsFromQuery_result);

List<JSONObject> matches = queryService.getMatchingRowIds(getRowIdsFromQuery_result);

// matchesArray is directly defined to make sure its exactly the same as in queryService.getRecordsFromQuery()
JSONObject matchesArray = new JSONObject("{\"testTable\":[\"testUUID\"]}");

// This mock fails when called from queryService.getRecordsFromQuery()
when(hbaseConnectionService.getRowsByIDs(matchesArray)).thenReturn(getRowsByIDs_result);

// This returns getRowsByIDs_result as expected
JSONArray test = hbaseConnectionService.getRowsByIDs(matchesArray);

// This returns null
JSONArray actual = new JSONArray(queryService.getRecordsFromQuery(filterParams, testIndex));
}
}

查询服务.java

@Service
public class QueryService {

@Autowired
private ElasticConnectionService elasticConnectionService;
@Autowired
private HBaseConnectionService hbaseConnectionService;
@Autowired
private PSQLConnectionService psqlConnectionService;

public String getRecordsFromQuery(
Map<String,String> filterParams,
String tablename) throws IOException {
/**
* Get records that match simple key/value filters
*/

// This mocked method returns exactly what was expected
List<List<JSONObject>> lookupsList = elasticConnectionService.getRowIdsFromQuery(filterParams, tablename);

List<JSONObject> matches = getMatchingRowIds(lookupsList);

// matchesArray is exactly the same as in the test class
JSONObject matchesArray = new JSONObject("{\"testTable\":[\"testUUID\"]}");

// This returns null
JSONArray hbResults = hbaseConnectionService.getRowsByIDs(matchesArray);

return hbResults.toString(4);
}
}

QueryServiceTestConfig.java

@Configuration
public class QueryServiceTestConfig {

@Bean
public QueryService queryService() {
return new QueryService();
}

@Bean
public ElasticConnectionService elasticConnectionService() {
return new ElasticConnectionService();
}

@Bean
public HBaseConnectionService hbaseConnectionService() {
return new HBaseConnectionService();
}

@Bean
public PSQLConnectionService psqlConnectionService() {
return new PSQLConnectionService();
}
}

最让我困惑的是,在 queryService.getRecordsByQuery() 中,elasticConnectionService.getRowIDsFromQuery() 模拟返回预期的结果,但 hbaseConnectionService.getRowsByIDs () 模拟返回 null

elastic 和 hbase 连接服务类都定义在同一个文件夹中,它们唯一的注释是 @Service。如果两者都失败,我会认为我的配置有误,但 elasticConnectionService 调用按预期工作的事实告诉我发生了其他事情。

最佳答案

如果JSONObject的包是org.jsonJSONObject的equals方法是这样的:

public boolean equals(Object object) {
return object == null || object == this;
}

由于 QueryService 中的 matchesArray 实例与 QueryServiceTest 中的实例不同,因此 equals()方法将返回 false。

尝试改变这个:

when(hbaseConnectionService.getRowsByIDs(matchesArray)).thenReturn(getRowsByIDs_result);

对此,看看你的结果是否改变:

when(hbaseConnectionService.getRowsByIDs(Mockito.any())).thenReturn(getRowsByIDs_result);

我想你也可以这样做:

when(hbaseConnectionService.getRowsByIDs(Mockito.eq(matchesArray))).thenReturn(getRowsByIDs_result);

或:

when(hbaseConnectionService.getRowsByIDs(Matchers.eq(matchesArray))).thenReturn(getRowsByIDs_result);

因为在幕后,Matchers.eq() 方法可能会调用 JSONObject.equals(),Matcher 可能不会工作(我没有检查Matchers.eq() 的源代码。

通常,在设置模拟方法调用时,您希望将 parameter(s) 包装在 Mockito 的 Matcher 方法之一中。不幸的是,这在您的场景中不起作用。

(注意类 Mockito 扩展了 Matchers)

关于java - 一个模拟类工作正常,另一个返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58715640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com