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



这是我的问题。

设置:

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

问题:

  • 我正在为 A 类编写测试。
  • 在测试中,我正在模拟对方法2的调用。

示例代码:

B b = Mockito.mock(B.class);
A a = new A(b);
Mockito.when(b.method2()).thenReturn(MY_LIST);
  • 现在当我调用方法1(又调用方法2)时,我得到一个
    空指针异常。

示例代码:

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

PS:C 类受到保护,A 类与 B 类和 C 类处于不同的包装中。

我看到你在测试中使用了Mockito。我最近在一个项目中使用它,并用以下内容做了一个测试项目。

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

    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);
    }
}

希望它能有用。

最新更新