使用Junit 5和Mockito在服务层中没有模拟DAO对象

cwtwac6a  于 2022-09-19  发布在  Spring
关注(0)|答案(1)|浏览(250)

我正在使用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);
    }
}
xxls0lw8

xxls0lw81#

ObjectMapper在该行中创建的对象:

XyzRoot xyzRoot = new ObjectMapper().readValue(configValue, XyzRoot.class);

是与测试中创建的示例完全分离的示例:

XyzRoot xyzRoot = new XyzRoot();
xyzRoot.setTable("TEST_TBL");

您没有为XyzRoot实现equals方法,因此简单引用相等性验证(==)是所有类继承的默认Object实现,返回false,因为对象是两个完全独立的示例。这就是为什么测试中定义的when(...).thenReturn(...)不能正常工作的原因-当Mockito检查是否应该为给定对象触发时,默认情况下它使用equals方法。
要解决此问题,应执行以下操作之一:

相关问题