Java 在方法PowerMock Mockito中模拟类构造函数
我在尝试使用PowerMock模拟类时遇到了一个问题。首先,这里是我当前的gradle依赖项:Java 在方法PowerMock Mockito中模拟类构造函数,java,unit-testing,apache-kafka,mockito,powermock,Java,Unit Testing,Apache Kafka,Mockito,Powermock,我在尝试使用PowerMock模拟类时遇到了一个问题。首先,这里是我当前的gradle依赖项: testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-core:2.+" testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2' testCompile gr
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.mockito:mockito-core:2.+"
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'
我正试图模拟打给卡夫卡经纪人的电话。代码如下所示:
public class MyConsumer {
public Consumer<Long, String> createConsumer() {
...
Consumer<Long, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(TOPIC);
....
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumer.class)
public class MyConsumerTest {
@Test
public void testCreateConsumer() {
...
KafkaConsumer mockConsumer = mock(KafkaConsumer.class);
doNothing().when(mockConsumer).subscribe(TOPIC);
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
Consumer<Long, String> result = myConsumerInstance.createConsumer();
...
}
}
当我尝试运行测试时,它们从未开始,我得到以下错误:
> Task :compileTestJava FAILED
/Users/myuser/myproject/src/test/java/myConsumerTest.java:101: error: unreported exception Exception; must be caught or declared to be thrown
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
^
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
FAILURE: Build failed with an exception.
Kafka.analyticsConsumerTest > testCreateConsumer FAILED
java.lang.RuntimeException at PowerMockTestNotifierImpl.java:84
Caused by: org.mockito.exceptions.base.MockitoException at MethodRoadie.java:87
所以我想我会把这句话总结一下,试着获得更多关于出错原因的信息。当我这样做时,测试会运行,但该特定测试会失败,并出现以下错误:
> Task :compileTestJava FAILED
/Users/myuser/myproject/src/test/java/myConsumerTest.java:101: error: unreported exception Exception; must be caught or declared to be thrown
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
^
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/myuser/myproject/src/test/java/myConsumerTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
FAILURE: Build failed with an exception.
Kafka.analyticsConsumerTest > testCreateConsumer FAILED
java.lang.RuntimeException at PowerMockTestNotifierImpl.java:84
Caused by: org.mockito.exceptions.base.MockitoException at MethodRoadie.java:87
我一辈子都没弄明白如何从中提取更多的信息。以前有人遇到过这样的事情吗
我目前的工作理论是关于卡夫卡消费阶级是如何返回消费者的?此实例中的消费者是org.apache.kafka.clients.Consumer.Consumer
。也许我没有正确地嘲笑这一点?如蒙协助,将不胜感激
谢谢你的建议,但是如果你重读上面的内容,我已经做到了。这就是我如何让运行时异常出现的原因。除非我误解了你的意思 也许你那边少了些什么? 检查下面的例子,它对我有用 格拉德尔:
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.mockito:mockito-core:2.+"
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'
compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.4.0'
}
单元测试:
import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumerTest.MyConsumer.class)
public class MyConsumerTest {
private static final Collection<String> TOPIC = Arrays.asList("1");
static class MyConsumer {
public Consumer<Long, String> createConsumer() {
Properties props = new Properties();
Consumer<Long, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(TOPIC);
return consumer;
}
}
@Test
public void testCreateConsumer() throws Exception {
KafkaConsumer<?,?> mockConsumer = PowerMockito.mock(KafkaConsumer.class);
PowerMockito.doNothing().when(mockConsumer).subscribe(TOPIC); // default behaviour, line is not required
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
MyConsumer myConsumerInstance = new MyConsumer();
Consumer<Long, String> result = myConsumerInstance.createConsumer();
}
}
导入java.util.array;
导入java.util.Collection;
导入java.util.Properties;
导入org.apache.kafka.clients.consumer.consumer;
导入org.apache.kafka.clients.consumer.KafkaConsumer;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumerTest.MyConsumer.class)
公共类支原体试验{
私有静态最终集合主题=Arrays.asList(“1”);
静态类支原体{
公共消费者(createConsumer){
Properties props=新属性();
消费者=新卡夫卡消费者(道具);
消费者。订阅(主题);
退货消费者;
}
}
@试验
public void testCreateConsumer()引发异常{
KafkaConsumer mockConsumer=PowerMockito.mock(KafkaConsumer.class);
PowerMockito.doNothing().when(mockConsumer.subscribe(主题);//默认行为,不需要第行
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments()。然后返回(mockConsumer);
MyConsumer myConsumerInstance=新的MyConsumer();
消费者结果=myConsumInstance.createConsumer();
}
}
谢谢你的建议,但是如果你重读上面的内容,我已经做到了。这就是我如何让运行时异常出现的原因。除非我误解了你的意思 也许你那边少了些什么? 检查下面的例子,它对我有用 格拉德尔:
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.mockito:mockito-core:2.+"
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'
compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.4.0'
}
单元测试:
import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumerTest.MyConsumer.class)
public class MyConsumerTest {
private static final Collection<String> TOPIC = Arrays.asList("1");
static class MyConsumer {
public Consumer<Long, String> createConsumer() {
Properties props = new Properties();
Consumer<Long, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(TOPIC);
return consumer;
}
}
@Test
public void testCreateConsumer() throws Exception {
KafkaConsumer<?,?> mockConsumer = PowerMockito.mock(KafkaConsumer.class);
PowerMockito.doNothing().when(mockConsumer).subscribe(TOPIC); // default behaviour, line is not required
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments().thenReturn(mockConsumer);
MyConsumer myConsumerInstance = new MyConsumer();
Consumer<Long, String> result = myConsumerInstance.createConsumer();
}
}
导入java.util.array;
导入java.util.Collection;
导入java.util.Properties;
导入org.apache.kafka.clients.consumer.consumer;
导入org.apache.kafka.clients.consumer.KafkaConsumer;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyConsumerTest.MyConsumer.class)
公共类支原体试验{
私有静态最终集合主题=Arrays.asList(“1”);
静态类支原体{
公共消费者(createConsumer){
Properties props=新属性();
消费者=新卡夫卡消费者(道具);
消费者。订阅(主题);
退货消费者;
}
}
@试验
public void testCreateConsumer()引发异常{
KafkaConsumer mockConsumer=PowerMockito.mock(KafkaConsumer.class);
PowerMockito.doNothing().when(mockConsumer.subscribe(主题);//默认行为,不需要第行
PowerMockito.whenNew(KafkaConsumer.class).withAnyArguments()。然后返回(mockConsumer);
MyConsumer myConsumerInstance=新的MyConsumer();
消费者结果=myConsumInstance.createConsumer();
}
}
您的代码无法编译,因为withAnyArguments()
引发选中的异常。您需要重新播放它或添加try catch
块。谢谢您的建议,但是如果您重新阅读上面的内容,我已经这样做了。这就是我如何让运行时异常出现的原因。除非我误解了你的意思@第二个例子对你没有帮助,考虑将完整的StAdTrack添加到你的问题中。你的代码无法编译,因为<代码>和AyAguMuths]()/Cyto>抛出了一个检查异常。您需要重新播放它或添加try catch
块。谢谢您的建议,但是如果您重新阅读上面的内容,我已经这样做了。这就是我如何让运行时异常出现的原因。除非我误解了你的意思@第二个例子对你没有帮助,考虑把完整的StActTrack添加到你的问题中。