Tag: mocking

java.lang.NoSuchMethodError:使用Mockito和Junit时的javax.servlet.http.HttpServletRequest.isAsyncStarted()

我试图用TDD弄湿我的脚。 我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写unit testing用例。 但是我收到运行时错误,从而导致测试失败。 起初,由于找不到javax.servlet.SessionCookieConfig ,我在设置中初始化MockMvc实例时遇到了问题。 我通过下载javax.servlet api并将其配置到项目的构建路径来解决,但后来我面临着 java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted() 在MockMvc实例上使用perform() 。 任何人都可以告诉我如何处理这种依赖,因为我认为它是由于不兼容的服务器servlet-api和javax.servlet api而发生的。 编辑:我发布我用于unit testing的代码,但我不认为这将是任何帮助,但以防万一: @RunWith(MockitoJUnitRunner.class) public class MyControllerTest { @InjectMocks private MyController myController = new MyController(); @Mock private MyService myService = new MyServiceImpl(); private MockMvc mockMvc; @Before public void setUp(){ this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build(); } @Test public void testList() throws Exception{ A a = […]

在JMockit中是否有一种方法可以从模拟方法中调用原始方法?

在我的模拟类中,我正在模拟方法foo()。 对于某些测试用例,我希望foo()的模拟实现返回一个特殊值。 对于其他测试用例,我想使用foo()的实际实现。 我在我的mock类中定义了一个布尔值,以便我可以在mock方法中确定是否要返回特殊值,或使用“real”方法。 问题是,我似乎无法弄清楚如何从模拟方法调用真正的方法。 我发现你可以在名为“it”的模拟对象中定义一个特殊成员(具有被模拟对象的类型)。 这允许您从模拟实现中引用真实类。 所以,我的计划是,如果我需要调用foo()的“真实”实现,mock方法将调用it.foo()。 但是,这不起作用,因为调用it.foo()只是再次调用模拟版本,而不是真实版本,所以我最终得到无限递归。 有没有办法让这项工作? 编辑:使用代码示例可能更清楚,这是我当前的模拟方法实现的样子: private RealClass it; … public SomeClass foo() { if(fakeIt) { return new SomeClass(“fakevalue”); } else { // doesn’t work, just keeps calling the mock foo // in infinite recursion return it.foo(); } } 编辑2:此外,对于我的大多数测试用例,我不想要模拟实现。 所以我最初的尝试是在我需要模拟对象的那些测试用例中只调用Mockit.redefineMethods()。 但这不起作用 – 似乎你只能在setup / teardown中这样做…我的模拟实现从未在我尝试时被调用。 解决方案说明: 起初我并不认为给出的答案有效,但在使用它之后,似乎问题在于我将JMockit“核心”方法与“注释”驱动方法混合在一起。 显然,在使用注释时,您需要使用Mockit.setupMocks,而不是Mockit.redefineMethods()。 这是最终奏效的: […]

如何validation是否未抛出exception

在我使用Mockito的unit testing中,我想validation是否没有抛出NullPointerException 。 public void testNPENotThrown{ Calling calling= Mock(Calling.class); testClass.setInner(calling); testClass.setThrow(true); testClass.testMethod(); verify(calling, never()).method(); } 我的测试设置了testClass ,设置了Calling对象和属性,以便该方法抛出NullPointerException 。 我validation从不调用Calling.method()。 public void testMethod(){ if(throw) { throw new NullPointerException(); } calling.method(); } 我想要一个失败的测试,因为它抛出一个NullPointerException ,然后我想写一些代码来解决这个问题。 我注意到的是测试总是通过,因为exception永远不会被测试方法抛出。

不鼓励在同一领域使用@ Spy和@InjectMocks吗?

在我正在进行的项目中,我经常看到@Spy和@InjectMocks在一个字段上一起使用。 但我从未在任何教程或其他资源中看到过这种方式。 我在谷歌搜索了这个特定的组合,但除了GitHub上的这个post之外没有找到任何其他内容: https : //github.com/mockito/mockito/issues/169 这让我觉得我们正在以一种奇怪的方式使用它。 注意:我认为同时使用两个注释的原因有时是因为如果你只使用@InjectMocks InjectMocks,Mockito尝试使用no-args构造函数来实例化类。 但是如果没有no-args构造@Spy并添加@Spy ,则可以使用该对象而无需空构造函数。 编辑:另一个重要用途是,如果只使用两个注释,则只能存根方法。

用mockito嘲笑一个单身人士

我需要测试一些遗留代码,它在方法调用中使用单例。 测试的目的是确保clas sunder测试调用单例方法。 我在SO上看到过类似的问题,但所有的答案都需要其他依赖项(不同的测试框架) – 我不幸的是仅限于使用Mockito和JUnit,但这对于这样的流行框架来说应该是完全可能的。 单身人士: public class FormatterService { private static FormatterService INSTANCE; private FormatterService() { } public static FormatterService getInstance() { if (INSTANCE == null) { INSTANCE = new FormatterService(); } return INSTANCE; } public String formatTachoIcon() { return “URL”; } } 被测试的课程: public class DriverSnapshotHandler { public String getImageURL() { return […]

PowerMock:模拟静态方法(+在某些特定方法中返回原始值)

我使用的是PowerMock 1.4.7和JUnit 4.8.2 我只需要模拟一些静态方法,我希望其他人(来自同一个类)只返回原始值。 当我使用mockStatic进行模拟并且不调用when().doReturn()所有静态方法都返回其默认值 – 返回Object时为null,返回boolean时返回false等等。 所以我尝试在每个静态方法上显式使用thenCallRealMethod来返回默认实现(意味着没有模拟/没有假货)但我不知道如何在每个可能的参数变量上调用它(=我想要每个可能的输入调用原始方法) 。 我只知道如何模拟具体的论证变异。

在Java中使用WireMock和SOAP Web服务

我对WireMock完全不熟悉 。 到目前为止,我一直在使用SOAPUI进行模拟响应。 我的用例很简单: 只是将SOAP XML请求发送到不同的端点( http:// localhost:9001 / endpoint1 )并获取预设的XML响应。 但是MockWrire必须作为独立服务部署到专用服务器上,该服务器将作为模拟响应的中心位置。 只想要一些开始的建议。 我可以看到WireMock更适合REST Web服务。 所以我的怀疑是: 1)我是否需要将其部署到Java Web服务器或容器以充当始终运行的独立服务。 我读到你可以通过使用来剥离 java -jar mockwire.jar –port [port_number] 2)我是否需要使用MockWire API? 我是否需要为我的用例制作课程? 在我的例子中,将通过JUnit测试用例触发请求以进行模拟。 3)如何实现简单的URL模式匹配? 如上所述,我只需要简单的模拟,即在向http:// localhost:9001 / endpoint1发出请求时获取响应 4)我的用例是否有更好/更容易的框架? 我读到了Mockable,但它对3个团队成员和免费层的演示域有限制。

为什么在服务和dao层中总是有单个实现接口?

我已经/看过一些spring-hibernate Web应用程序项目,它们具有与实际服务和dao类一样多的接口。 我一直认为这两个是这些单一实现接口的主要原因: Spring可以将实际实现连接为给定类中的依赖项(松散耦合) public class Person { @Autowired private Address address; @Autowired private AccountDetail accountDetail; public Person(Address address, AccountDetail accountDetail) { // constructor 在进行unit testing时,我可以创建模拟类并单独测试类。 Address mockedAddress = mock(Address); AccountDetail mockedAccountDetail = mock(AccountDetail); Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); // unit test follows 但是,最近,我意识到: Spring可以将具体实现类连接为依赖项: public class Person { @Autowired private AddressImpl address; @Autowired […]

使用PowerMock进行每次测试后,模拟行为都会重置

我正在使用PowerMock编写unit testing,模拟一些util类的行为。 为测试类定义一次行为(通过@BeforeClass注释)会导致: 第一次测试调用返回模拟值 第二次测试调用返回实际方法返回值 示例代码: import org.junit.Assert; import org.junit.BeforeClass; 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( {A.class, B.class}) public class TestMockedMethods { private static B b; @BeforeClass public static void setUp() { PowerMockito.mockStatic(A.class); PowerMockito.when(A.getVal()).thenReturn(“X”); b = PowerMockito.mock(B.class); PowerMockito.when(b.getVal()).thenReturn(“Y”); } @Test public void test1() { // PASS Assert.assertEquals(“X”, A.getVal()); Assert.assertEquals(“Y”, […]

测试从stdin读取并写入stdout的java程序

我正在为java编程竞赛编写一些代码。 程序的输入是使用stdin给出的,输出是在stdout上。 你们如何测试在stdin / stdout上运行的程序? 这就是我的想法: 由于System.in的类型为InputStream而System.out的类型为PrintStream,因此我使用此原型在func中编写了我的代码: void printAverage(InputStream in, PrintStream out) 现在,我想用junit测试一下。 我想使用String伪造System.in并在String中接收输出。 @Test void testPrintAverage() { String input=”10 20 30″; String expectedOutput=”20″; InputStream in = getInputStreamFromString(input); PrintStream out = getPrintStreamForString(); printAverage(in, out); assertEquals(expectedOutput, out.toString()); } 实现getInputStreamFromString()和getPrintStreamForString()的“正确”方法是什么? 我这让它变得比它需要的更复杂吗?