【问题标题】:Mock method in abstract class that inherit abstract class继承抽象类的抽象类中的模拟方法
【发布时间】:2020-01-28 11:13:29
【问题描述】:

我的 spring-boot 项目中有一个扩展抽象类的服务

public class TestService extends AbstractTest1Service {
// some methods
}

public abstract class AbstractTest1Service extends AbstractTest2Service {

    public String doSomething() {
        return writeText();
    }
}


public abstract class AbstractTest2Service {

    String writeText() {
        return "text";
    }
}

当我想测试TestService 时,有什么方法可以模拟writeText() 方法:

【问题讨论】:

  • 你想测试TestService类吗?
  • 我不明白为什么这是不可能的
  • 是的,我想测试 TestService.class,它使用我想模拟的 doSomething() 方法返回不同的值
  • 你为什么不能模拟doSomething?顺便说一句,我认为您可以像往常一样轻松地模拟 writeText。您可以模拟writeText,然后模拟doSomething 以返回值,该值由模拟writeText 产生
  • doSomething 是包私有的,我在示例代码中犯了错误

标签: java spring mockito


【解决方案1】:

您的TestService 班级:

public class TestService extends AbstractTest1Service {
    AbstractTest2Service abstractTest2Service;

    public String doSomething() {
        abstractTest2Service.writeText();
        System.out.println("Passed!");
        return "All Checked";
    }
}

你的TestServiceTest 类应该是这样的:

import org.junit.Assert;
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 TestServiceTest {
    @InjectMocks
    TestService testService;

    @Mock
    AbstractTest2Service abstractTest2Service;

    @Test
    public void testService(){
        Assert.assertEquals("All Checked",testService.doSomething());
    }
}

注意:不要使用@Spy代替@Mock,Spy会尝试检查抽象类方法的实际实现,这不是 那里,所以你的测试将被忽略。只需使用@Mock

使用@Spy 会报错:

无法为“abstractTest2Service”字段实例化 @Spy。你 没有提供在字段声明时进行间谍活动的实例,所以我 试图构建实例。但是,我失败了,因为:类型 'AbstractTest2Service 是一个抽象类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2010-09-29
    相关资源
    最近更新 更多