使用@SpringApplicationConfiguration批注将模拟注入Spring bean

时间:2015-06-06 21:18:40

标签: spring spring-boot

有一个使用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注释的方法创建的,那么上面的代码工作正常。

如何解决这个问题?如果这是错误的做法,最佳做法是什么?

0 个答案:

没有答案