编程语言
首页 > 编程语言> > java – EJB没有接口视图测试(arquillain&mockito)

java – EJB没有接口视图测试(arquillain&mockito)

作者:互联网

我正在研究Java EE 7(在wildfly 9.0.2上)应用程序,我偶然发现了一篇文章http://www.oracle.com/technetwork/articles/java/intondemand-1444614.html.主要是关于:

Premature Extensibility Is the Root of Some Evil

在我遇到的某些情况下这是有道理的.我已经将一些类更改为无接口视图.实现本身不是问题,但测试是.

例如,我有这两个类.

@Stateless
public class SomeBean {
     public String getText()
     {
         return "Test text";
     }
}

@Stateless
public class SomeOtherBean {
    @Inject
    private SomeBean someBean;

    public String getText()
    {
        return someBean.getText();
    }
}

我想以某种方式,someBean属性被覆盖,最好是一个模拟对象.不改变SomeBean和SomeOtherBean类.我已经尝试了一些例子,但它们没有用于例如:
https://github.com/arquillian/arquillian-showcase/tree/master/extensions/autodiscover/src/test/java/org/jboss/arquillian/showcase/extension/autodiscover

有没有人遇到过这个并有解决方案?

解决方法:

我最终使用了2个解决方案.

解决方案1:使用mockito进行内部或更小的测试

为了测试特定类,Mockito非常有用,因为它支持依赖注入.

@RunWith(MockitoJUnitRunner.class)
public class SomeOtherBeanTest {
    @Mock
    private SomeBean someBean;

    @InjectMocks
    private SomeOtherBean someOhterBean;

    @Before
    public void setUp() {
        Mockito.when(someBean.getText()).thenReturn("Overwritten!");
    }

    @Test
    public void testGetText() throws Exception {
        assertEquals("Overwritten!", someOhterBean.getText());
    }
}

解决方案2:使用@Produces和@Alternatives模拟外部服务(例如模拟OAuth2服务器)或更大的测试(例如集成测试)

首先,我创建一个新的@Alternative注释:

@Alternative
@Stereotype
@Retention(RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
public @interface CDIMock {}

然后将此作为构造型添加到arquillian beans.xml部署中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
    <alternatives>
        <stereotype>com.project.CDIMock</stereotype>
    </alternatives>
</beans>

之后在单独的类中创建一个新的@Producer方法:

public class SomeBeanMockProducer {
    @Produces @CDIMock
    public static SomeBean produce() {
        SomeBean someBean = Mockito.mock(SomeBean.class);
        Mockito.when(someBean.getText()).thenReturn("mocked");

        return someBean;
    }  
}

将SomeBeanMockProducer类添加到arquillian部署中,您应该让它工作.

此解决方案的替代方法是使用@Specializes并扩展SomeBean实现.在我看来,这并没有给我足够的控制,比如@Alternative Mocking解决方案(在我的例子中是@CDIMock).

例如,假设我SomeBean具有调用远程服务器的方法.如果我为此添加一个方法并忘记在@Specializes类中@override它将进行真正的远程调用,这不是Mocking的情况.

标签:java,mockito,ejb,ejb-3-1,jboss-arquillian
来源: https://codeday.me/bug/20190623/1269590.html