我正在使用JUnit5和Mockito为服务层编写测试用例。我使用@Mock
模拟数据库层,并使用@InjectMocks
注入服务层。但,当调用转到服务方法时,不知何故,DAO中的模拟列表将变为空。我正在为其他测试类设置类似的设置,它运行良好。我甚至在同一个类中尝试创建一个简单的流,它接受一个字符串参数并返回一个字符串对象,结果成功了。但不知何故,对于这个方法,它不适合我。在调试时,我检查了参数是否按预期传递,它的DAO层即使在模拟后也给出了空列表。请让我知道我在这里做错了什么。
服务层
@Service
public class XyzServiceImpl implements XyzService {
@Autowired
private XyzDAO xyzDAO;
@Override
public Map<String, String> getRecords(Map<String, String> allParams) throws Exception {
String key = allParams.get("key");
String configValue = System.getProperty(key);
XyzRoot xyzRoot = new ObjectMapper().readValue(configValue, XyzRoot.class);
List<Map<String, Object>> records = xyzDao.getRecords(xyzRoot, allParams); // list is coming as empty
for (Entry<String, Object> entry : records.get(0).entrySet()) {
recordsMap.put(entry.getKey(), entry.getValue()!= null ? entry.getValue().toString() : "");
}
return recordsMap;
}
}
下面是测试类的代码
public class TestXyzService {
@InjectMocks
private XyzServiceImpl xyzServiceImpl;
@Mock
private xyzDAO xyzDao;
private static String data = null;
@BeforeEach
public void init() {
MockitoAnnotations.initMocks(this);
}
@BeforeAll
public static void setUp() throws IOException {
data = FileUtils.loadFileData("record-history.json");
}
@Test
void getRecordTest() throws Exception {
Gson gson = new Gson();
Map<String, String> expectedDetails = gson.fromJson(data,
new TypeToken<Map<String, String>>() {
}.getType());
Map<String, Object> recordDetailsMap = gson.fromJson(data,
new TypeToken<Map<String, Object>>() {
}.getType());
List<Map<String, Object>> recordDetails = new ArrayList<>();
recordDetails.add(recordDetailsMap);
Map<String, String> allParams = new LinkedHashMap<>();
allParams.put(AppConstants.PARAM_PAGE_NAME, "HISTORY_TBL");
allParams.put(AppConstants.PARAM_ARG1, AppConstants.ARG1);
XyzRoot xyzRoot = new XyzRoot();
xyzRoot.setTable("TEST_TBL");
Configuration configuration = new Configuration();
configuration.setArgument("COL");
xyzRoot.setConfig(configuration);
String config = gson.toJson(xyzRoot);
System.setProperty("key", config);
when(xyzDao.getRecords(xyzRoot, allParams)).thenReturn(recordDetails);
Map<String, String> actualDetails = xyzServiceImpl.getRecords(allParams); // getting error due to empty list from dao
assertNotNull(actualDetails);
assertEquals(expectedDetails, actualDetails);
verify(xyzDaoDao, times(1)).getRecords(xyzRoot, allParams);
}
}
1条答案
按热度按时间xxls0lw81#
ObjectMapper
在该行中创建的对象:是与测试中创建的示例完全分离的示例:
您没有为
XyzRoot
实现equals
方法,因此简单引用相等性验证(==
)是所有类继承的默认Object
实现,返回false
,因为对象是两个完全独立的示例。这就是为什么测试中定义的when(...).thenReturn(...)
不能正常工作的原因-当Mockito检查是否应该为给定对象触发时,默认情况下它使用equals
方法。要解决此问题,应执行以下操作之一:
XyzRoot
(remember about the contract)定义equals
和hashCode