java - 使用 Mockito 使用 @Value 时如何模拟 map

标签 java mockito

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

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

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

最佳答案

如果你只是想模拟你的 map 并将它注入(inject)你的被测类,你应该创建一个模拟 map 并通过 ReflectionTestUtils 注入(inject)它:

被测类:

@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);
    }
}

对于SpringBootTest可以使用ReflectionTestUtils:

@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);
    }
}

关于java - 使用 Mockito 使用 @Value 时如何模拟 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69113265/

相关文章:

java - 如何模拟 MyClass.class.getClassLoader()?

java - 为什么有 26 个 GMT 偏移量?

java - angularjs $http.post 和 spring restful 的错误请求

java - 缺少 "ice:column"的开始标记

javascript - Java Server Socket 传输 String 到 web socket

java - 需要访问存储库的测试方法

java - 按最低有效数字排序

java - PowerMockito。模拟静态方法。为什么 PowerMockito#stub 不起作用?

java - 调用模拟函数时更新非模拟对象

java - 测试安卓应用程序。试图模拟 getSystemService。