首页 > 解决方案 > 使用私有字段和@PostConstruct 对 Spring 引导服务进行单元测试

问题描述

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

@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也添加为字段。

标签: javaunit-testingspring-boot

解决方案


以下示例显示了一个@Service使用构造函数注入来获取所需AnotherServicebean 的 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有一个构造函数。请参阅此处了解更多信息。

使用 Spring 进行测试
使用@RunWith ( SpringRunner.class ) 和@SpringBootTest注入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);
    }
}

Fake是一个假的AnotherService接口实现,它允许您进行纯单元测试。


推荐阅读