0
我已經與@Inject如何覆蓋@Produces使用模擬
@Produces
@ApplicationScoped
public Client createClient() {
return new TransportClient().addTransportAddress(new InetSocketTransportAddress(IP, 9300));
}
我想嘲笑這個客戶端在我的單元測試的東西,如以下
使用產生的ElasticSearch客戶端類@Produces
@Mock
private Client client;
這會導致AmbiguousResolutionException,因爲同一個bean有兩個提供程序。
我該如何優先考慮我的模擬生產的類只進行單元測試?
從下面的評論,我做了以下更改。我在替代方案中設定了一個突破點,但沒有受到打擊。
ElasticSearchProducer.java
@ApplicationScoped
public class ElasticSearchProducer {
public static final String IP = "10.9.215.28";
private Client client;
@PostConstruct
public void init() {
client = createClient();
}
protected Client createClient() {
return new TransportClient().addTransportAddress(new InetSocketTransportAddress(IP, 9300));
}
@Produces
@ApplicationScoped
public Client getClient() {
return client;
}
}
ElasticSearchProducerAlternative.java
@Alternative
@ApplicationScoped
public class ElasticSearchProducerAlternative extends ElasticSearchProducer {
@Override
public Client createClient() {
return Mockito.mock(Client.class);
}
}
測試-beans.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>com.walmart.platform.pv.cdi.ElasticSearchProducerAlternative</class>
</alternatives>
</beans>
ArquillianTest.java
@RunWith(Arquillian.class)
public abstract class ArquillianTest {
@Deployment(testable = true)
public static WebArchive createDeployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class, "quintessence.war")
.addPackages(true, "com.w.platform");
war.merge(ShrinkWrap.create(GenericArchive.class).as(ExplodedImporter.class)
.importDirectory("src/main/webapp").as(GenericArchive.class),
"/", Filters.includeAll());
war.addAsManifestResource("etc/conf/test/import.sql");
war.addAsManifestResource("test-persistence.xml", "persistence.xml");
war.addAsWebInfResource("test-beans.xml", "beans.xml");
war.addAsWebInfResource("test-resources.xml", "resources.xml");
System.out.println(war.toString(true));
return war;
}
}
在我的測試中,不使用替代類
感謝您的回覆,我嘗試了更改並遇到問題。你能否請回顧一下我上面做的編輯。 –
這行在你的代碼片段中看起來不正確,你能解決它嗎? 'WebArchive war = ShrinkWrap.create(WebArchive.class,「test.war」)。addPackages(true,「test);' –
另外,你能澄清一下你的運行時是什麼嗎?Container + version? –