当前位置: 首页 > 知识库问答 >
问题:

Spring JUnit:如何在autowired组件中模拟autowired组件

徐嘉谊
2023-03-14

我有一个Spring组件我想测试,这个组件有一个autowired属性,为了单元测试的目的,我需要更改它。问题是,这个类在后构造方法中使用autowired组件,所以我不能在它实际使用之前替换它(即通过反射)。

我该怎么做?

@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 runner autowire不同的实例吗?

共有1个答案

罗渝
2023-03-14

你可以用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");   
}
 类似资料:
  • 我想测试使用自动连线网络客户端的服务类检索不同响应JSON时的程序行为。为此,我希望在测试中能够用从文件读取的JSON替换从api url检索的响应体JSON。 具体来说,我想测试DTO中使用

  • 在我的服务类中,我有@Autowired HttpServletRequest,并且在我的服务方法中使用相同的对象,但是对于那个服务方法测试类,我不能在我的测试方法中模拟HttpServletRequest对象,请检查下面的代码。我正在获取请求对象的空指针异常

  • 我使用的是Spring3.1.4.Release和Mockito1.9.5。在我的春季课上,我有: 我想为我的“Defaulturl”字段模拟一个值。请注意,我不想模拟其他字段的值--我希望保持这些字段的原样,只保留“Defaulturl”字段。还要注意,我的类中没有显式的“setter”方法(例如),我不想仅仅为了测试的目的创建任何方法。 既然如此,我如何模拟一个字段的值呢?

  • 当我使用@service时,它工作得很好。 当我使用@RESTController时,它抛出一个NullPointerException。 它不能把控制器连上电线是不是有什么原因?我想它可能与创建web上下文有关,但我也尝试添加SpringBootTest和指向MOCK(和其他)的webEnvironment,看看这是否能让它发挥作用。 我也踢过MockMvc的东西,但我不确定它应该如何工作。 有

  • 我试图为我的模型类实现一个自定义验证器,该验证器依赖于我的自定义bean(通过声明)。在本文中,我遵循了有关该主题的Spring文档。我的对象是根据本教程实现的。 但是,在运行我的测试时,对象中的autowired属性总是。为什么会这样? 以下是我的代码的相关部分: 我的自定义bean, 我的自定义约束 存储库使用Spring Data JPA的