java 如何判断自动连线的示例是否是正确的类?

vlju58qv  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(140)

我的Java项目使用Spring,我有一个接口Connector,它由几个类实现,ConnectorV1ConnectorV2等等。
这些类被注解为@Component("V1")@Component("V2")等以进行区分。这些类是针对请求范围配置的。例如:

@Component("V2")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public class ConnectorV2 implements Connector {

我的一个集成测试类使用@Autowired @Qualifier("V2")来获取ConnectorV2的一个示例作为classUnderTest并测试它。我最近发现我不小心连接了ConnectorV1并收到了奇怪的测试结果。因此,我想在其中一个测试方法中再次检查我手头是否真的有正确的类。
不幸的是,我AssertclassUnderTest的具体类的所有尝试都失败了,因为运行时的示例首先是com.sun.proxy$Proxy{someNumber},即使像AssertJ的assertThat(classUnderTest).isInstanceOf(ConnectorV2.class)这样的灵活Assert也无法标识实际的类。
有没有办法超越代理,看到它封装的“真实的”类?

aiazj4mn

aiazj4mn1#

你可以使用AopProxyUtils.ultimateTargetClass(controller)。下面是一个简单的例子:

@SpringBootTest(classes = Question.ControllerV2.class)
public class Question {

    @Component("V2")
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
    static class ControllerV2 implements Controller {}

    interface Controller {}

    @Autowired
    @Qualifier("V2")
    private Controller controller;

    @Test
    void testInstanceOf() {
        Class<?> clazz = AopProxyUtils.ultimateTargetClass(controller);
        Assertions.assertThat(clazz).isEqualTo(ControllerV2.class);
    }

}

不过,你确定这是个好主意吗?这将把测试和实现结合起来。B.D.D.方法建议测试行为,并从测试中抽象出实现细节--使重构更容易。无论如何,希望这有帮助。如果有帮助,我将感激你投赞成票。

相关问题