Spring JUnit:如何在自连线组件中模拟自动连接组件

2022-08-31 12:37:15

我有一个我想测试的Spring组件,这个组件有一个自动连接的属性,我需要为了单元测试而更改它。问题是,该类在后构造方法中使用自动连接组件,因此我无法在实际使用之前替换它(即通过ReflectreTestUtils)。

我应该怎么做?

这是我要测试的类:

@Component
public final class TestedClass{

    @Autowired
    private Resource resource;

    @PostConstruct
    private void init(){
        //I need this to return different result
        resource.getSomething();
    }
}

这是测试用例的基础:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class TestedClassTest{

    @Autowired
    private TestedClass instance;

    @Before
    private void setUp(){
        //this doesn't work because it's executed after the bean is instantiated
        ReflectionTestUtils.setField(instance, "resource", new Resource("something"));
    }
}

在调用 postconstruct 方法之前,有没有办法用其他东西替换资源?想告诉Spring JUnit运行器自动连接不同的实例吗?


答案 1

你可以使用Mockito。我不确定具体,但这通常有效:PostConstruct

// Create a mock of Resource to change its behaviour for testing
@Mock
private Resource resource;

// Testing instance, mocked `resource` should be injected here 
@InjectMocks
@Resource
private TestedClass testedClass;

@Before
public void setUp() throws Exception {
    // Initialize mocks created above
    MockitoAnnotations.initMocks(this);
    // Change behaviour of `resource`
    when(resource.getSomething()).thenReturn("Foo");   
}

答案 2

Spring Boot 1.4 引入了名为 @MockBean 的测试注释。因此,现在嘲笑和监视Spring Bean得到了Spring Boot的原生支持。


推荐