簡體   English   中英

多次使用Mockito。中的相同ArgumentMatchers

[英]Using same ArgumentMatchers in Mockito.when multiple times

我最近一直在學習測試,但這是我必須在要模擬的函數中傳遞變量的第一個測試。 我編寫了一個類似的測試,唯一的區別是我在此測試中使用了ArgumentMatcher,因為testInput.validate()需要3個字符串來傳遞。 我對這些東西不太了解,所以對不起該術語。

這是我要測試的代碼:

@Component
public class RequestHandler {

private static Gson gson = new Gson();
private final UserRepository userRepository;
private final TestInput testInput;

@Autowired
public RequestHandler(UserRepository userRepository, TestInput testInput) {
    this.userRepository = UserRepository;
    this.testInput = testInput;
}

public String addUser(String username, String email, String password) {
    if (testInput.validate(username, email, password) && !(userRepository.findById(email).isPresent())) {
        User user = new User(username, email, password);
        userRepository.save(user);
        return gson.toJson(user);
    } else {
        return gson.toJson("error");
    }
  }
}

這是我的測試:

public class RequestHandlerTest {
    UserRepository userRepository = Mockito.mock(UserRepository.class);
    TestInput testInput = Mockito.mock(TestInput.class);

    RequestHandler requestHandler = new RequestHandler(userRepository, testInput);

    String test = ArgumentMatchers.anyString();

    @Test
    public void addUserTest() {
        Mockito.when(testInput.validate(test, test, test)).thenReturn(true, false); 

        Mockito.when(userRepository.findById(test).isPresent()).thenReturn(false, true);

        String jsonUser = new Gson().toJson(new User("username123","example@mail.com","12344321"));
        String jsonError = new Gson().toJson("error");

        System.out.println("addUser Test1");
        assertEquals(jsonUser, requestHandler.addUser("username123","example@mail.com","12344321"));

        System.out.println("addUser Test2");
        assertEquals(jsonError, requestHandler.addUser("username123","example@mail.com","12344321"));
    }
}

我的這段代碼有很多錯誤,當我將ArgumentMatchers.anyString()更改為ArgumentMatchers.any()時,出現了1個錯誤,而不是5個錯誤。

您的測試中有很多問題。

  1. 你不能這樣使用

     String test = ArgumentMatchers.anyString(); Mockito.when(testInput.validate(test, test, test)).thenReturn(true, false); 

    您可以從錯誤消息中清楚地看到執行此操作時Mockito在說什么

     org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 3 matchers expected, 1 recorded: 

    這意味着您需要傳遞三個不同的實例。

  2. 這條線也不正確

     Mockito.when(userRepository.findById(test).isPresent()).thenReturn(false, true); 

findById應該返回Optional,但是您返回的是布爾值。 使用Mockito時,應該模擬各個步驟。 我的意思是在您的示例中,您需要模擬userRepository.findById(test) ,然后在返回的模擬上進行isPresent 您不能跳過一個步驟而轉到下一個步驟。

這是一個工作代碼

public class RequestHandlerTest {
    UserRepository userRepository = Mockito.mock(UserRepository.class);
    TestInput testInput = Mockito.mock(TestInput.class);

    RequestHandler requestHandler = new RequestHandler(userRepository, testInput);

    @Test
    public void addUserTest() {
        when(testInput.validate(anyString(), anyString(), anyString())).thenReturn(true, false);


        User username123 = new User("username123", "example@mail.com", "12344321");
        String jsonUser = new Gson().toJson(username123);
        String jsonError = new Gson().toJson("error");


        when(userRepository.findById(anyString())).thenReturn(Optional.empty(),Optional.of(username123));
        System.out.println("addUser Test1");
        assertEquals(jsonUser, requestHandler.addUser("username123","example@mail.com","12344321"));

        System.out.println("addUser Test2");
        assertEquals(jsonError, requestHandler.addUser("username123","example@mail.com","12344321"));
    }
}

我調查了此問題的源代碼,並向其他讀者提供了信息,潛在的問題是該模擬函數被聲明為“靜態”。 從發布的問題中看不出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM