CDI:为什么我在单元测试中得到两个 javax.ejb.Singleton 实例?

CDI: Why am I getting two instances of javax.ejb.Singleton in my unit test?

得到一个 class MyService 注释 @javax.ejb.Singleton

@Singleton
public class MyService() { 
    ..
}

下面的单元测试 (Arquillian) 失败(1 和 2):

@Inject private MyService myService1;
@Inject private MyService myService2;

@Test
public void singletonScopedTest() {

    // 1
    assertEquals(myService1, myService2);

    // 2
    assertTrue(myService1== myService2);
}

同样的测试应用于 @ApplicationScoped 生产的 beans 将通过。

问题

为什么 @Singleton 的测试失败但 @ApplicationScoped 的测试通过?

EJB 的@Injected 对象是代理,而不是对象实例本身。

您的单元测试正在比较代理对象。