Ожидается исключение из теста Mockito

Я пытаюсь протестировать свой уровень обслуживания и репозиторий в spring -boot, и для этого я использую Mockito, как часть моего теста, я проверяю любой запрос входа в систему, и если имя пользователя или пароль неверны, исключение должен быть брошен.

Я проверяю, существует ли пользователь и мой тест проходит успешно, но я не могу пройти тест, когда имя пользователя не существует. Вот мой код для тетов

@Mock
UserRepository userRepository;

@InjectMocks
UserServiceImpl userServiceImpl;

Users mockUser = Mockito.mock(Users.class);

private String username = "real_user";

private String fakeUser = "fake_user";

@Before
public void setup() {
    mockUser.setUsername(username);
    mockUser.setPassword(new BCryptPasswordEncoder().encode("password"));
    mockUser.setEnabled(true);
}

/**
 * This Test Passes
 */
@Test
public void should_LoadUsersByUsername_IfUserExists() {
    Mockito.when(userRepository.findByUsername(username)).thenReturn(mockUser);
    userServiceImpl.loadUserByUsername(username);
    Mockito.verify(userRepository, Mockito.atLeastOnce()).findByUsername(username);
}

/**
 * This Test Fails
 */
@Test(expected = UsernameNotFoundException.class)
public void should_Throw_UserNameNotFoundException_If_UserIsNotFound() {
    Mockito
       .when(userRepository.findByUsername(fakeUser))
       .thenThrow(UsernameNotFoundException.class);
}

Это код, на котором я пытаюсь запустить тест

@Service
public class UserServiceImpl implements UserService {

@Autowired
UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    Users user = userRepository.findByUsername(username);
    if (user == null) {//I'm trying to hit this line with my test that fails
        throw new UsernameNotFoundException("The user was not found");
    }
    return user;
}

Когда я запускаю свои тесты, я получаю следующее

java.lang.AssertionError: Expected exception: org.springframework.security.core.userdetails.UsernameNotFoundException
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Приведенная ниже строка сбивает меня с толку, потому что в моем тесте я заявляю, что UsernameNotFoundException следует выбросить, если пользователь не существует.

java.lang.AssertionError: Expected exception: org.springframework.security.core.userdetails.UsernameNotFoundException

Я следил за учебником, нашел здесь под номером 2

Non-Void Return Type

но не повезло, я знаю, что могу достичь своей цели с помощью JUnit, но я хочу сначала попробовать сделать это с помощью Mockito

Я знаю, что мне что-то не хватает, может ли кто-нибудь помочь мне понять, что здесь происходит

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
10 498
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В неудачном тестовом примере вы вообще не вызываете функцию loadUserByUsername. Это должно сработать.

@Test(expected = UsernameNotFoundException.class)
public void should_Throw_UserNameNotFoundException_If_UserIsNotFound() {
    Mockito
       .when(userRepository.findByUsername(fakeUser))
       .thenThrow(UsernameNotFoundException.class);
   userServiceImpl.loadUserByUsername(fakeUser);
}

Поскольку вы не вызываете функцию, исключение никогда не генерируется, но вы сказали Mockito, что будет исключение, и, следовательно, Mockito говорит

java.lang.AssertionError: Expected exception: org.springframework.security.core.userdetails.UsernameNotFoundException

Вам нужно вызвать функцию, которую вы пытаетесь протестировать. Похоже, вы пропустили это в неудачном тесте -

userServiceImpl.loadUserByUsername(username);

Я хотел бы сказать вам, что есть лучший способ проверить исключение, чем @Test (ожидается). Давайте посмотрим на пример assertj

assertThatThrownBy(() -> userRepository.findByUsername(fakeUser)) 
        .isInstanceOf(UsernameNotFoundException.class)
        .hasMessage("some message")
        .hasNoCause();

Другие вопросы по теме