使用mockito powermokito模拟覆盖的方法

时间:2016-09-30 06:14:35

标签: java unit-testing mockito powermock powermockito

我想通过模拟类Service的重写方法testB1Method2来测试我的a1Method2类方法B1。我不想更改课程A1B1中的任何内容。我正在使用mockito 1.9.0和powermockito 1.4.12。我正在尝试以下代码:

UnitTestService类:

import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test;

public class UnitTestService {

    @Mock
    B1 b1;
    @InjectMocks
    Service service = new Service();

    @Test
    public void testB1Method2() throws Exception {
        MockitoAnnotations.initMocks(this);
        when(b1.a1Method2()).thenReturn("mockvalue");
        PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1);
        String output = service.serviceMethod();
        System.out.println("=====" + output);
        Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!");
    }

}

服务类:

public class Service {

    public String serviceMethod() {
        B1 b1 = new B1("some data");
        return b1.a1Method2();
    }

}

A1班:

public abstract class A1 {

    public A1(String data) {
        //doing many thing with data
    }

    public String a1Method1() {
        return "from a1Method1";
    }

    public String a1Method2() {
        return "from a1Method2";
    }

}

B1班:

public class B1 extends A1 {

    public B1(String data) {
        super(data);
    }

    @Override
    public String a1Method1() {
        return "a1Method1 from B1 class";
    }

}

我在eclipse中使用testNG运行类UnitTestService。这里B1类a1Method2中的实际方法被调用,因为它正在打印" =====来自a1Method2"在控制台。即:在这里似乎mockito无法模仿这种方法。

我应该在UnitTestService课程中对模拟班级B1 a1Method2进行哪些代码更改?

1 个答案:

答案 0 :(得分:0)

你在那里创建了难以测试代码,绝对没有充分的理由。 什么打破了你的脖子是你的服务类中的新B1 的小呼唤。

如果您要对该对象使用依赖注入;那么你绝对不需要处理powermock和嘲笑继承的方法。因为那时你可以简单地创建一个“模拟”B1;把它传递给你的服务;然后你可以完全控制测试期间会发生什么。

因此,这里可行的替代方案可能是通过简单地改进生产代码来避免复杂的测试设置,以便更容易测试。

观看那些videos以更好地理解我在说什么!