gpt4 book ai didi

java - EJB 无接口(interface) View 测试(arquillain 和 mockito)

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:47 25 4
gpt4 key购买 nike

我正在开发 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

在我遇到的某些情况下,这是有道理的。我已将一些类更改为无界面 View 。实现本身不是问题,但是测试是问题。

例如我有这两个类。

@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 属性最好被模拟对象覆盖。无需更改 SomeBeanSomeOtherBean 类。我已经尝试了一些例子,但它们没有用,例如: https://github.com/arquillian/arquillian-showcase/tree/master/extensions/autodiscover/src/test/java/org/jboss/arquillian/showcase/extension/autodiscover

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

最佳答案

我最终使用了 2 种解决方案。

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

对于测试特定的类,Mockito 非常有用,因为它支持依赖注入(inject)。

@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 this 它将进行真正的远程调用,而 Mocking 则不会出现这种情况。

关于java - EJB 无接口(interface) View 测试(arquillain 和 mockito),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com