【问题标题】:Junit mocking for Linked MultiValueMap用于 Linked MultiValueMap 的 Junit 模拟
【发布时间】:2021-12-03 22:31:57
【问题描述】:

我正在尝试使用 LinkedMultiValueMap 模拟方法,但没有任何成功。长话短说,几天前我刚刚开始使用 Mockito 和 Junit 进行测试,实际上我不知道自己在做什么。我将提供我的测试方法代码,以及我编写模拟测试的尝试。

@Service
public class VaultService {
public VaultService() {

        String baseUrl = System.getenv("VAULT_HOST") + "/api/v" + System.getenv("VAULT_API_VERSION");
        String userAgent = System.getenv("APPLICATION_NAME") + "/" + System.getenv("APPLICATION_VERSION");

        webClient = WebClient.builder()
                .baseUrl(baseUrl)
                .defaultHeader(HttpHeaders.USER_AGENT, userAgent)
                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                .build();
    }

    @Scheduled(fixedDelay = 1200000)
    public void authenticate() {
        LinkedMultiValueMap<String, String> login = new LinkedMultiValueMap<>();
        login.add("username", System.getenv("VAULT_USERNAME"));
        login.add("password", System.getenv("VAULT_PASSWORD"));

        webClient.post()
                .uri("/auth")
                .body(BodyInserters.fromMultipartData(login))
                .retrieve()
                .bodyToMono(AuthenticationResponse.class)
                .map(authenticationResponse -> {
                    setSessionId(authenticationResponse.sessionId);
                    return authenticationResponse;
                })
                .block();
    }
}

这是我编写模拟测试失败的尝试:

class VaultServiceTest {
    private WebClient webClientMock;

    @BeforeEach
    void setup() {
        webClientMock = mock(WebClient.class);
    }

    @Test
    void authenticate() {
        VaultService vaultService = new VaultService();
        LinkedMultiValueMap<String, String> testAuthenticate = mock(LinkedMultiValueMap.class);
        when(testAuthenticate.get("password")).thenReturn(Collections.emptyList());
    }
}

【问题讨论】:

  • 永远不要模拟 LinkedMultiValueMap 这样的集合类型。做一个真正的。
  • 或任何类型的纯数据,无需修改任何行为。 @LouisWasserman
  • @LouisWasserman >> 你的意思是,用 LinkedMultiValueMap 制作地图?
  • 我的意思是做一个真正的LinkedMultiValueMap。不要模拟它,构建它。

标签: java junit mockito


【解决方案1】:

正如 cmets 中提到的,模拟值对象或任何类型的不包含任何逻辑或耗时或需要大量资源或未在测试中的对象是没有意义的(外部或由您的功能使用,但不是您的功能)。

说到这里,我通常会考虑两类“测试”:

  • 测试调用其他功能的功能
  • 测试具有自己逻辑的功能,然后,对于给定的输入,它们确实有明确的输出

您正在测试的服务属于第一类,因此我将测试您调用的 Web 服务是否使用正确的参数调用。

所以,我不知道 Spring,但你应该使用一系列

Mockito.verify(mockObject).methodToCall(parameter1, parameter2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多