java - 使用私有(private)字段和@PostConstruct对Spring boot服务进行单元测试

标签 java unit-testing spring-boot

我有一个这样定义的 Spring boot 服务

@Service
public class MyService {
    private String field1;
    private String field2;

    @Autowired
    private AnotherService anotherService

    @PostConstruct
    public void init() {
        anotherService.initField1(field1);
        anotherService.initField2(field2);
    }

    public String foo() {
        return field1 + field2;
    }
}

我应该如何为 foo 编写单元测试。好吧,更多的是关于如何处理类字段和 PostConstruct 方法。

谢谢!!

编辑: 还添加了 AnotherService 作为字段。

最佳答案

以下示例显示了一个 @Service Bean,它使用构造函数注入(inject)来获取所需的 AnotherService bean:

@Service
public class MyService {
    private String field1;
    private String field2;

    private final AnotherService anotherService;

    public MyService(AnotherService anotherService) {
        this.anotherService = anotherService;
        this.anotherService.initField1(field1);
        this.anotherService.initField2(field2);
    }

    public String foo() {
        return field1 + field2;
    }
}

请注意,您可以省略 @Autowired,因为 MyService 有一个构造函数。请参阅here了解更多信息。

使用 Spring 进行测试
使用@RunWith ( SpringRunner.class ) 和 @SpringBootTest注入(inject) MyService 并开始使用它:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {
    @Autowired    
    private MyService service;

    @Test
    public void testFoo() {
        String expResult = "";
        String result = service.foo();
        assertEquals(expResult, result);
    }
}

不使用 Spring 进行测试

public class MyServiceTest2 {
    private MyService service;

    @Before
    public void setUp() {
        service = new MyService(new AnotherService.Fake());
    }

    @Test
    public void testFoo() {
        String expResult = "";
        String result = service.foo();
        assertEquals(expResult, result);
    }
}

这里FakeAnotherService接口(interface)的假实现,它允许您进行纯单元测试。

关于java - 使用私有(private)字段和@PostConstruct对Spring boot服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833014/

相关文章:

java - 如何在不调用 exit() 的情况下销毁 Processing PApplet?

javascript - 如何在 Jest.js 中测试递归函数

java - 在 Spring boot 中从任意 bean 访问 EntityMamanger

c# - 如何使用 NSubstitute 假调用当前类的方法?

javascript - 用户界面中的 Spring boot AJAX POST 请求和 knockout.js 调试错误

spring-boot - 集成测试 camel-spring-boot 路由

java - Feign 单元测试未找到响应

java - NetBeans 8.2 不支持 JDK 1.4 源二进制格式吗?

java - 无法运行路径设置为 Java 6 的 Grails 2.1

java - 为单元测试创​​建对象 MockHttpServletResponse 时出错