PowerMock вызывает реальный метод - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь шпионить приватный метод с PowerMock, но в строке, когда я определяю, что должно быть возвращено при вызове приватного метода, он вызывает метод, и я получаю и Null Pointer Exception. Какой PowerMock вызывает реальный метод в этой строке?

 myService= PowerMockito.spy(new MyService(myParam));

  .....
 PowerMockito.when(myService, "getCLientBy", anyString(), anyString(), anyString()).thenRetur`n(Client.of(setName, new HashSet<>())); // here it calls real method

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

@ user1474111 и @ Nkosi

Я построил небольшую симуляцию вашего примера. Возможно, вам также нужно добавить класс Client в аннотации PrepareForTest.

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ MyService.class, Client.class })
    public class Example1Test {

        @Test
        public void testPowerMockito() throws Exception {

            MyService myService = PowerMockito.spy(new MyService("myParam"));

            PowerMockito.when(myService, "getClientBy", ArgumentMatchers.anyString(), ArgumentMatchers.anyString(),
                    ArgumentMatchers.anyString()).thenReturn(Client.of("setName", new HashSet<String>()));

            myService.run();

            Assert.assertEquals("setName", myService.getClient().getName());
        }
    }

    public class MyService {

        private Client client;

        public MyService(String param) { }

        private Client getClientBy(String a, String b, String c) {
            return new Client(a + b + c);
        }

        public Client getClient() {
            return this.client;
        }

        public void setClient(Client client) {
            this.client = client;
        }

        public void run() {
            setClient(getClientBy("A", "B", "C"));
        }

    }

   public class Client {

        private final String name;

        public Client(String name) {
            this.name = name;
        }

        public static Client of(String name, HashSet<String> hashSet) {
            return new Client(name);
        }

        public String getName() {
            return name;
        }

    }
0 голосов
/ 22 октября 2019

Убедитесь, что вы готовите свой класс для использования в шпионе, добавив @PrepareForTest(MyService.class)

@RunWith(PowerMockRunner.class)
// We prepare MyService for test because it's final 
// or we need to mock private or static methods
@PrepareForTest(MyService.class)
public class YourTestCase {

    //...

    @Test
    public void spyingWithPowerMock() {  

        MyService classUnderTest = PowerMockito.spy(new MyService(myParam));

        //.....

        // use PowerMockito to set up your expectation
        PowerMockito.doReturn(Client.of(setName, new HashSet<>()))
            .when(classUnderTest, "getClientBy", anyString(), anyString(), anyString());



        //...

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

...