来自受保护的抽象方法的模拟方法

时间:2015-01-29 11:58:50

标签: java unit-testing mockito powermock

这是我的问题。

设定:

  • 我的A类有一个B类的私有成员变量。
  • A类中的方法(method1)调用非静态方法(method2) 在B班。
  • B类实际上从受保护的抽象类C继承method2,并且不会覆盖它。

问题:

  • 我正在为A班写一个考试。
  • 在测试中,我嘲笑对方法2的调用。

示例代码:

B b = Mockito.mock(B.class);
A a = new A(b);
Mockito.when(b.method2()).thenReturn(MY_LIST);
  • 现在当我调用method1(又调用method2)时,我得到了一个 的NullPointerException。

示例代码:

a.method1();
  • 我假设这个调用完全独立于方法2的实现,因为我嘲笑它。那是错的吗?如果没有,我做错了什么?

PS:C类受到保护,A类与B类和C类不同。

1 个答案:

答案 0 :(得分:0)

我看到你在测试中使用Mockito。我最近在一个项目上使用过它,我做了一个测试项目,如下所示。

首先使用另一个类(B)的服务(A)。

    public class Service {

    private NonStaticClass nonStatic;

    public NonStaticClass getNonStatic() {
        return nonStatic;
    }

    public void setNonStatic(NonStaticClass nonStatic) {
        this.nonStatic = nonStatic;
    }

    public int useStaticService () {
        return 2*StaticClass.staticMethod();
    }

    public Integer getLastUse () {
        return this.nonStatic.getLastUse();
    }
}

然后是(B)类:

    public class NonStaticClass {

    private Integer lastUse = new Integer(0);

    public Integer getLastUse() {
        return lastUse++;
    }
}

为了测试正在工作,我为它创建了一个测试。

    import static org.mockito.Mockito.when;
import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class TestNonStaticMock {

    private final Integer staticMethodOutput = 10;

    @Mock
    NonStaticClass mock = new NonStaticClass();

    @InjectMocks
    Service service = new Service();

    @Before
    public void before () {
        setMock();
    }

    private void setMock() {
        when(mock.getLastUse()).thenReturn(staticMethodOutput);
    }

    @Test
    public void mockNonStaticMethod () {
        Integer result = service.getLastUse();
        System.out.println(result.toString());

        Assert.assertEquals(staticMethodOutput, result);
    }
}

希望它有用。