使用 Mockito 使用 @Value 时如何模拟地图

How to Mock Map when using @Value using Mockito

我已经回答了这个问题:How do I mock an autowired @Value field in Spring with Mockito?。我们如何模拟以下内容?

@Value("#{${patientTypes}}")
private Map<String, Integer> patientTypes;

以便我们在进行模拟时可以访问它的值?

如果你只想模拟你的地图并将其注入你的 class 测试中,你应该只创建一个模拟地图并通过 ReflectionTestUtils:

注入它

Class 测试中:

@Component
public class MyService {

    @Value("#{${patientTypes}}")
    private Map<String, Integer> patientTypes;

    public Integer getPatientTypeByKey(String key) {
        return patientTypes.get(key);
    }
}

对于 Mockito-test 你可以只使用 InjectMocks:

@ExtendWith(MockitoExtension.class)
public class SimpleTest {

    @InjectMocks
    private MyService underTest;

    @Mock
    private Map<String, Integer> mockMap;


    @Test
    public void test() {
        when(mockMap.get(anyString())).thenReturn(15);

        Integer result = underTest.getPatientTypeByKey("some key");

        assertEquals(15, result);
    }
}

对于SpringBootTestReflectionTestUtils可以使用:

@SpringBootTest
public class SBTest {

    @Autowired
    private MyService underTest;

    @Mock
    private Map<String, Integer> mockMap;


    @Test
    public void test() {
        ReflectionTestUtils.setField(underTest, "patientTypes", mockMap);

        when(mockMap.get(anyString())).thenReturn(15);

        Integer result = underTest.getPatientTypeByKey("some key");

        assertEquals(15, result);
    }
}