当父级位于不同的程序包中时,模拟受保护的父级方法 [英] Mock Protected Parent Method When the Parent is in a Different Package

查看:272
本文介绍了当父级位于不同的程序包中时,模拟受保护的父级方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在被测类的父类中模拟一个受保护的方法,但该父类位于不同的包中,因此我的测试类无法访问该方法,因此无法模拟它。

I need to mock a protected method in the parent class of my class under test but the parent class is in a different package so my test class cannot access that method so I cannot mock it. There's gotta be a solution for this issue without refactoring

我需要使用Powermock和Mockito。这是JAR文件

I need to use Powermock and Mockito. Here's the JARs


  • mockito-all 1.10.8

  • powermock-core 1.6.1

  • powermock-module-junit4 1.6.1

  • powermock-api-mockito 1.6.1

  • junit 4.12

  • mockito-all 1.10.8
  • powermock-core 1.6.1
  • powermock-module-junit4 1.6.1
  • powermock-api-mockito 1.6.1
  • junit 4.12

这是遗留代码,因此我无法重构,但这是简化代码。

This is legacy code so I cannot refactor, but here's the simplified code.

Parent.java

package parent;

public class Parent {

    // Want to mock this protected parent method from different package
    protected String foo() {

        String someValue = null;

        // Logic setting someValue

        return someValue;
    }
}

Child.java

package child;

import parent.Parent;

public class Child extends Parent {

    String fooString = null;

    public String boo() {

        this.fooString = this.foo();

        String booString = null;

        // Logic setting booString

        return booString;
    }
}

ChildTest.java

package child;

import static org.mockito.Mockito.spy;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import parent.Parent;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Parent.class, Child.class })
public class ChildTest {

    // Class Under Test
    Child cut;

    @Before
    public void setUp() throws Exception {

        // Partial mock to mock methods in parent class
        cut = spy(new Child());

    }

    @Test
    public void testBoo() {

        // TODO: Need to mock cut.foo() but can't figure out how.

        // Following gives me this error: The method foo() from the type Parent is not visible
       Mockito.when(((Parent)cut).foo()).thenReturn("mockValue");

        // Test
        cut.boo();

        // Validations
        Assert.assertEquals(cut.fooString, "mockValue");

    }
}


推荐答案

您可以使用PowerMock来模拟没有公共方法。

You can use PowerMock to mocking no public method.

@RunWith(PowerMockRunner.class)
public class ChildTest {

    @Test
    public void testBoo() throws Exception {
        //given
        Child child = PowerMockito.spy(new Child());
        PowerMockito.when(child, "foo").thenReturn("mockValue");

        //when
        String boo = child.boo();

        //then
        Assert.assertEquals("boo+mockValue", boo);
    }
}

这篇关于当父级位于不同的程序包中时,模拟受保护的父级方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆