Инжекция в ложное поле с использованием Mockito - PullRequest
0 голосов
/ 13 мая 2019

Я новичок в JUnit PowerMockito. Я пытаюсь проверить метод внутри class.that класса, имеющего автоподзавода. Класс обслуживания

@Service
public class MyServiceRegistration
{


    @Autowired
    private AppConfig appConfig;


    public void register() throws xception
    {
    //Do some thing
    }
}

AppConfig

@Component
public class AppConfig
{
    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private String serverPort;
    //getter and setter
}

Тестовый класс

@RunWith(PowerMockRunner.class)
@PrepareForTest({ AppConfig.class })
@PowerMockIgnore({ "javax.management.*" })
public class MyServiceRegistrationTest
{ 
    @InjectMocks
    MyServiceRegistration myServiceRegistration = new MyServiceRegistration();
    @Mock
    private AppConfig appConfig;

    @Before
    public void setUp() throws Exception
    {
        PowerMockito.when(AppConfig.getApplicationName()).thenReturn("SomeValue");
        MockitoAnnotations.initMocks(this);
    }

    public final void testRegister() throws Exception
    {

        myServiceRegistration.register();
    }
}

Когда я отлаживаю код, я вижу, что AppConfig подделан. Но поля applicationName и serverPort имеют нулевое значение.

экран отладки

enter image description here

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Проблема с вашим кодом заключается в том, что вы вводите свои макеты дважды.

  • Сначала они вводятся с помощью @RunWith(PowerMockRunner.class)
  • Второй раз, вручную с помощью MockitoAnnotations.initMocks(this);

Вы устанавливаете ожидания для первого экземпляра, а затем перезаписываете макеты, поэтому ожиданий нет.

Чтобы доказать это

@Before
public void setUp() throws Exception
{
    PowerMockito.when(appConfig.getApplicationName()).thenReturn("SomeValue");
    AppConfig beforeInitMocks = appConfig;
    MockitoAnnotations.initMocks(this);
    AppConfig afterInitMocks = appConfig;
    System.out.println("Same object?: " + (beforeInitMocks == afterInitMocks));
}

Примечание: я полагаю, что в вашем посте есть опечатка, вы должны иметь PowerMockito.when(appConfig.getApplicationName()) (с нижним регистром appConfig)

0 голосов
/ 14 мая 2019

Перемещено

PowerMockito.when(AppConfig.getApplicationName()).thenReturn("SomeValue"); 

в testRegister метод.Теперь это работает.

...