Внедрение автоматической проводной переменной - PullRequest
1 голос
/ 05 ноября 2019

У меня есть следующий класс обслуживания:


    @Component
    public class ABC {


      @Autowired private SomeClass assumeRoles; 

      @Override
      public @NotNull Optional<Something> translate(int id) {
             // Some Code
             SomeClass result = assumeRoles.getRole(id);

      }
   }

Теперь я хочу написать Junit для своего класса, я не хочу, чтобы вызывали Role.getRole(id), вместо этого я хочу издеваться над этимвызов функции, с некоторым фиктивным значением.

Так я могу это сделать?

У меня есть класс Junit как

    @RunWith(MockitoJUnitRunner.class)
    public class ABCTest {

      @InjectMocks
      private ABC test = new ABC();

      @Mock
      private SomeClass assumeRoles;


      @Test
      public void testTranslate() {

        ABC result =  test.translate(id);    
      }

    }

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Вы уже пометили SomeClass assumeRoles как @Mock, вы можете смоделировать оператор Role.getRole(id); следующим образом.

Mockito.when(assumeRoles.getRole(Mockito.any(id))).thenReturn(someResult);

Я ответил на вопрос после некоторых предположений, я предлагаю вам улучшитьпредоставленный вами фрагмент кода с правильными именами переменных и классов.

0 голосов
/ 05 ноября 2019

Кстати, field injection не рекомендуется командой пружин, объясненной здесь: https://blog.marcnuri.com/field-injection-is-not-recommended/

Итак, вам лучше пометить поле final, если требуется: private final SomeClass assumeRoles;, затем предоставитьконструктор, подобный следующему:

public ABC(SomeClass assumeRoles) {
  this.assumeRoles = assumeRoles;
}

Таким образом, было бы легче передать фиктивный SomeClass в конструктор, чтобы получить экземпляр ABC.

...