我在运行以下代码时遇到问题:
configService.setMainConfig("src/test/resources/MainConfig.xml");
Run Code Online (Sandbox Code Playgroud)
来自Junit @Before方法.
这是Maven构建其目标文件夹的方式吗?
在单元测试中计算方法调用的最佳方法是什么.任何测试框架都允许这样做吗?
有一个通用的方法,将类作为参数,我有问题与Mockito存根.该方法如下所示:
public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate(
Object target, Validator validator, Class<T> responseClass,
Class<U> errorEnum);
Run Code Online (Sandbox Code Playgroud)
这真是可怕,至少对我而言......我可以想象没有它的生活,但代码库的其余部分愉快地使用它......
在我的单元测试中,我打算将此方法存根以返回一个新的空对象.但是我如何用mockito做到这一点?我试过了:
when(serviceValidatorStub.validate(
any(),
isA(UserCommentRequestValidator.class),
UserCommentResponse.class,
UserCommentError.class)
).thenReturn(new UserCommentResponse());
Run Code Online (Sandbox Code Playgroud)
但由于我正在混合和匹配匹配器和原始值,我得到"org.mockito.exceptions.misusing.InvalidUseOfMatchersException:无效使用参数匹配器!"
如何使用Mockito验证模拟方法根本没有被调用 - 使用任何参数组合?
例如,我有一个对象 - myObject使用第二个模拟对象 - myMockedOtherObject有一个方法 - someMethodOrOther(String parameter1, String parameter2).
我想调用myObject.myMethod()并验证someMethodOrOther() 不会被调用 - 使用任何参数组合.
例如:
myObject.doSomeStuff();
verify(myMockedOtherObject, never()).someMethodOrOther();
Run Code Online (Sandbox Code Playgroud)
除非我不能这样做,因为someMethodOrOther()需要提供特定的参数.
我需要一些帮助:
例:
void method1{
MyObject obj1=new MyObject();
obj1.method1();
}
Run Code Online (Sandbox Code Playgroud)
我想obj1.method1()在我的测试中模拟,但要透明,所以我不想制作和更改代码.在Mockito有什么办法吗?
我想测试一些在同一个类中调用其他人的方法.它基本上是相同的方法,但参数较少,因为数据库中有一些默认值.我在这上面展示
public class A{
Integer quantity;
Integer price;
A(Integer q, Integer v){
this quantity = q;
this.price = p;
}
public Float getPriceForOne(){
return price/quantity;
}
public Float getPrice(int quantity){
return getPriceForOne()*quantity;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想测试是否在调用方法getPrice(int)时调用了方法getPriceForOne().基本上调用普通方法getPrice(int)和mock getPriceForOne.
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
....
public class MyTests {
A mockedA = createMockA();
@Test
public void getPriceTest(){
A a = new A(3,15);
... test logic of method without mock ...
mockedA.getPrice(2);
verify(mockedA, times(1)).getPriceForOne();
}
}
Run Code Online (Sandbox Code Playgroud)
考虑一下,我有一个更复杂的文件,这个文件是其他人的实用工具,必须全部在一个文件中.
我有一个Spring 3.2 MVC应用程序,并使用Spring MVC测试框架来测试我的控制器操作的GET和POST请求.我正在使用Mockito来模拟服务,但我发现模拟被忽略了,而且我的实际服务层正被使用(因此,数据库正在被击中).
我的Controller测试中的代码:
package name.hines.steven.medical_claims_tracker.controllers;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import name.hines.steven.medical_claims_tracker.domain.Policy;
import name.hines.steven.medical_claims_tracker.services.PolicyService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({ "classpath:/applicationContext.xml", "classpath:/tests_persistence-applicationContext.xml" })
public class PolicyControllerTest {
@Mock
PolicyService service;
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() …Run Code Online (Sandbox Code Playgroud) 我使用以下内容.
Powermock-mockito 1.5.12
Mockito 1.95
junit 4.11
Run Code Online (Sandbox Code Playgroud)
这是我的utils类
public void InternalUtils {
public static void sendEmail(String from, String[] to, String msg, String body) {
}
}
Run Code Online (Sandbox Code Playgroud)
这是被测试班级的要点:
public class InternalService {
public void processOrder(Order order) {
if (order.isSuccessful()) {
InternalUtils.sendEmail(...);
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是测试:
@PrepareForTest({InternalUtils.class})
@RunWith(PowerMockRunner.class)
public class InternalService {
public void verifyEmailSend() {
mockStatic(Internalutils.class);
doNothing().when(InternalUtils, "sendEmail", anyString(), any(String.class), anyString(), anyString());
Order order = mock(Order.class);
when(order.isSuccessful()).thenReturn(true);
InternalService is = new InternalService();
verifyStatic(times(1));
is.processOrder(order);
}
}
Run Code Online (Sandbox Code Playgroud)
上述测试失败.给出的验证模式为none,但根据代码,如果订单成功,则必须发送电子邮件.
我正在使用TestNG测试业务服务,在春季启动应用程序中进行模拟单元测试.
应用程序是多模块弹簧启动项目.我正在为业务模块编写单元测试.
我在pom中添加了以下依赖关系测试,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>${javaxel.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.servlet</artifactId>
<version>${javax.servlet.version}</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的包装器注释看起来像
@Service
@Transactional
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyServiceAnnotation{}
Run Code Online (Sandbox Code Playgroud)
我的TestApp看起来像
@SpringBootApplication
public class TestApp{ .... }
Run Code Online (Sandbox Code Playgroud)
我的商业服务看起来像
@MyServiceAnnotation
public class AddressServiceImpl implements AddressService {
@Autowire
UserDAO userDAO;
@Autowire
AddressDAO addressDAO;
public Address find(int userId) …Run Code Online (Sandbox Code Playgroud) 说我在嘲笑这门课 Foo
class Foo {
public void doThing(Bar bar) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这是 Bar
class Bar {
private int i;
public int getI() { return i; }
public void setI(int i) { this.i = i; }
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用Mockito的验证功能来查看是否Foo#doThing(Bar)在具有特定实例Bar或任何 Barwith 的模拟上调用Mockito.any(Bar.class),但是有没有办法确保它被任何调用Bar但具有特定值i或者Bar#getI()?
我所知道的可能是:
Foo mockedFoo = mock(Foo.class);
Bar someBar = mock(Bar.class);
...
verify(mockedFoo).doThing(someBar);
verify(mockedFoo).doThing(any(Bar.class);
Run Code Online (Sandbox Code Playgroud)
我想知道的是,是否有办法验证一个Bar关于它的特定事物是否作为参数传递.
mockito ×10
java ×8
mocking ×5
unit-testing ×5
junit4 ×2
class ×1
generics ×1
jmockit ×1
local ×1
object ×1
spring ×1
spring-boot ×1
spring-mvc ×1
testng ×1