有一个使用spring-aop的spring-boot应用程序。 proxy-target-class为true。 我正在尝试为服务类创建测试。此服务取决于组件类。我想在服务中注入一个模拟而不是真正的组件。
我发现了一些类似的问题:
我在最后一个问题上选择了这个answer,我试图实现这种方法。我之所以选择它,是因为它与代理类的实现细节无关,我可以在其他测试中轻松使用配置类。
下面是模拟真实问题的例子。
@org.aspectj.lang.annotation.Aspect
@org.springframework.stereotype.Component
public class Aspect {
@Before("within(demo.Service)")
public void someAdvice() {
System.out.println("advice");
}
}
@org.springframework.stereotype.Service
public class Service {
@Autowired
private Component component;
public void action() {
System.out.println(component.action());
}
}
@org.springframework.stereotype.Component
public class Component {
public String action() {
return "real action";
}
}
@SpringApplicationConfiguration
public class ServiceTest extends BaseTest {
@Autowired
Service service;
@Test
public void testAction() {
service.action();
}
@Configuration
public static class Config {
@Mock Component mock;
public Config() {
MockitoAnnotations.initMocks(this);
}
@Bean
public Component component() {
Mockito.when(mock.action()).thenReturn("mock action");
return mock;
}
}
}
完整示例:https://github.com/eds0404/spring-inject-mock-into-proxy
上面的代码没有按照我的预期运行,该服务不使用mock("实际操作"如果运行测试将打印)。但是如果Component类没有用@Component注释标记,并且其对象是由带有@Been注释的方法创建的,那么上面的代码工作正常。
如何解决这个问题?如果这是错误的做法,最佳做法是什么?