PowerMockito не умеет издеваться над приватным методом - PullRequest
0 голосов
/ 25 марта 2020
@Service
public class Topic_Service
{
   private String test_help()
   {
      return "test_help";
   }

   public String testing()
   {
      return test_help() + " " + "testing";
   }
}



//Test Code

@SpringBootTest
@RunWith(PowerMockRunner.class)
@PrepareForTest(Topic_Service.class)
class Topic_Service_test
{

   @InjectMocks
   private Topic_Service topic_service =  PowerMockito.spy(new 
   Topic_Service());

   @Test
   void testing_test() throws Exception
   {

     PowerMockito.when(topic_service,"test_help").thenReturn("hello");
     String s = topic_service.testing();
     Assertions.assertEquals("hello testing",s);
   }
}



//POM.XML Dependencies

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version> 2.8.47</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.7.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>1.7.0</version>
        <scope>test</scope>
    </dependency>

Мой тест не проходит и показывает эту ошибку: -

ПРЕДУПРЕЖДЕНИЕ: произошла недопустимая операция доступа с отражением ПРЕДУПРЕЖДЕНИЕ: незаконный доступ с отражением от org.powermock.reflect.internal.WhiteboxImpl (файл: /home/an.kumar1/.m2/repository/org/powermock/powermock-reflect/1.7.0/powermock-reflect-1.7.0.jar) для метода java .lang.Object.finalize () ВНИМАНИЕ: Пожалуйста, рассмотрите возможность сообщить об этом сопровождающим org.powermock.reflect.internal.WhiteboxImpl. ПРЕДУПРЕЖДЕНИЕ. Используйте --illegal-access = warn для включения предупреждений о дальнейших незаконных операциях доступа с отражением. ВНИМАНИЕ: В будущем все незаконные операции доступа будут запрещены. release

org.mockito.exceptions.misusing.MissingMethodInvocationException: when () требует аргумент, который должен быть «вызовом метода для макета». Например: when (mock.getArticles ()). ThenReturn (Articles);

Кроме того, эта ошибка может появиться, потому что: 1. Вы заглушаете одно из: final / private / equals () / hashCode () методы. Эти методы не могут быть проверены / проверены. Методы насмешки, объявленные для родительских классов c, не являющихся публичными, не поддерживаются. 2. внутри when () вы вызываете метод не на макете, а на каком-то другом объекте.

Кто-нибудь может мне помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 25 марта 2020

Вы не правильно оформили частный метод. Вам нужно использовать PowerMockito.stub, чтобы заглушить приватные методы.

Ниже описано, как правильно заглушить приватный метод:

PowerMockito.stub(PowerMockito.method(Topic_Service.class,"test_help")).toReturn("hello");

Я изменил ваш код, как показано ниже:


@RunWith(PowerMockRunner.class)
@PrepareForTest(Topic_Service.class)
public class Topic_ServiceTest {

    @Test
    void testing_test() throws Exception {
        // Setup
        Topic_Service topic_serviceSpy = PowerMockito.spy(new Topic_Service());
        PowerMockito.doReturn("Hello").when(topic_serviceSpy, "test_help");
        // exercise
        String s = topic_serviceSpy.testing();
        // verify
        Assertions.assertEquals("hello testing",s);
    }

}

И я запускаю тест с передачей аргумента --illegal-access=permit.

...