- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要测试一种创建 Car
对象并使用 CarDao
将其保存在数据库中的方法。另一种方法创建 Car
对象,但如果 CarDao
是模拟的,则 car.getUser()
返回 null
而不是正确的用户
对象。这是我的代码。
Mockito.doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
lastCarId++;
Car car = (Car) invocationOnMock.getArguments()[0];
// here car.getUser() returns correct user object
car.setId(lastCarId);
Mockito.when(carDao.getById(car.getId())).thenReturn(car);
return null;
}
}).when(carDao).persist(Mockito.any());
为什么carDao.getById(carId).getUser()
返回null?我需要做什么才能获得具有正确 user
字段值的完整对象?
已更新
carDao
用法:
Car car = carService.create("car name1", "color", "year", user); // in this method called carDao.persist(...);
car.setColor("color2");
carService.findById(car.getId());
// this method calls carDao.getById(carId)
// and comapres with authenticated user ID.
// But carDao.getById(carId) returns car with user == null
下面是 CarService
类的一部分,其中代码抛出 NullPointerException。
// carService.findById(...) method
public Car findById(Car id) {
Car car = carDao.getById(id);
User carUser = car.getUser(); // returns null
User currentUser = accountService.getAuthenticatedUser(); // returns correct user object
if (!carUser.getId().equals(currentUser.getId())) { // throws NullPointerException
return null;
}
return car;
}
谢谢。
最佳答案
据我从示例中了解到,您有一些要测试的类,我们将其称为Handler
。在此处理程序中,您使用 CarService 来“构建和存储”汽车对象,并在数据库中“查找”汽车对象(通过一些用户
验证)。在 CarService 中,您使用 CarDao
来处理数据库。
所以首先:如果你测试 Handler 类,那么你需要模拟 IT 自己的依赖项,这意味着你需要模拟 CarService,而不是 CarService 中的 CarDao(不是第二层嵌套依赖项)。每次测试CarService时都需要模拟CadDao,并且应该将测试与CarHandlerTest分开。
第二:我模拟了您的示例并且它有效,请参阅下面的代码。
public class User {} //simple user just to verify not null
public class Car {
private Long id;
private User user;
//getters ans setters
}
public class CarDao { //with stub methods because we will mock it
public void persist(Car car) {}
public Car getById(Long id) {return new Car();}
}
public class CarHandler {
private CarService carService; //with setter
public void foo() { // we will test this method
User user = new User(); //it's like your example but without additional fields (like color)
Car car = carService.create(user); // here we build and store new car
Car sameCar = carService.findById(car.getId());
assert car == sameCar;
}
}
public class CarService {
private CarDao carDao; //with setter
public Car create(User user) {
Car car = new Car();
car.setUser(user);
carDao.persist(car); //here car should get id
return car;
}
public Car findById(Long id) {
Car car = carDao.getById(id);
User user = car.getUser(); //this user should be not null in test
assert user != null; //this assert for verify user
return car;
}
}
最有趣的部分 - 测试。
public class CarHandlerTest {
static long lastCarId = 5;
private CarHandler carHandler = new CarHandler();
private CarService carService = new CarService();
private CarDao carDao;
@Test
public void testFoo() throws Exception {
carDao = Mockito.mock(CarDao.class);
carService.setCarDao(carDao);
carHandler.setCarService(carService);
Mockito.doAnswer(new Answer<Void>() { //I copy it from your example
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
lastCarId++;
Car car = (Car) invocationOnMock.getArguments()[0];
// here car.getUser() returns correct user object
car.setId(lastCarId);
Mockito.when(carDao.getById(car.getId())).thenReturn(car);
return null;
}
}).when(carDao).persist(Mockito.any());
carHandler.foo();
}
}
您还可以从 foo()
方法返回 Car
并验证测试中的所有内容。
关于java - 如果从 Mockito.doAnswer(...) 调用,为什么 Mockito.when(...).doReturn(...) 不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907896/
我有以下测试用例: ClassPathResource resource = new ClassPathResource(...); doReturn(resource.getInputStream(
我无法让 Mockito 覆盖我正在测试的类中的方法。 @Test public void test_classToTest() throws Exception { DependencyA
好吧,我显然不太明白 doReturn(...).when(...) 和 when(...).thenReturn(...) 之间的区别。 问题是,当我上课时,我用 @Mock 注释模拟,并在我想测试
我有这个工作正常的代码。 public class MyClass implements Serializable { ... private UploadedFile uploadedFile;
我想运行一个方法,即使在@Before我设置了 doReturn(mockResult).when(spyObject).getResult(); 对于我的所有其他测试方法来说这样做是有意义的,但我现
如果我有一个对象 MyObject,我想在调用该对象的某些方法时返回一些值。例如这样的事情: doReturn(someValue).when(Mockito.any(MyObject.class))
这是我正在测试的类(class): public class A { public Integer callMethod(){ return someMethod(); } private Int
我正在尝试对以下方法进行单元测试: Class TestClass { public List test(String a, String b, String c, String d) thr
我做了很多 Mockito spy ,只是在一个新项目中模仿我自己的工作示例。但这惨遭失败 import org.apache.http.HttpEntity; import org.apache.h
当我尝试模拟方法时,收到 UnfinishedStubbingException 。我试图让 doReturn 返回实现特定接口(interface)的类的模拟实例。该接口(interface)是被模
我是 Mockito 新手。我知道 spy 对象永远不会调用 doReturn 的原始方法,但在我的代码中,这没有发生 import static org.junit.Assert.assertTru
我有一个单例类来帮助我从控制台读取输入: public class IOHelper { public org.slf4j.Logger logger = Logger.logger;
我正在尝试通过 doReturn 方法使用 Mockito 深度 stub 功能。 当我在深度 stub 示例中使用 when 方法时,它工作正常: Foo mock = mock(Foo.class
我正在为 SOAP API 编写单元测试,我需要在其中模拟某个方法的响应,但该方法一直被调用。 我的单元测试的(相关)代码如下: import org.mockito.Matchers; import
我有一个 junit 测试,其中我在类中模拟了一个对象。让我们用名为 mocker 的 MyManager 的 @Mock 调用类 Mocker。 示例类: public class Mocker {
当我不能使用 Mockito.when() 时,如何使用 PowerMockito 中的 doReturn 模式来模拟静态方法? 我想测试以下静态方法: public static PrintWrit
我正在测试一些遗留代码并尝试模拟父类(super class)中的某些行为。奇怪的是,mockito 不会触发并返回我期望的值,在某些情况下,它甚至在 doReturn 行上抛出 Nullpointe
我有一个方法调用,需要在第一次调用时返回 valueA,在第二次调用时返回 valueB。我正在使用 PowerMockito spy ,所以如果我只需要返回一个值,它看起来像这样: PowerMoc
我要测试的类: import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; imp
我是 PowerMockito 的新手,它显示的行为我不明白。以下代码解释了我的问题: public class ClassOfInterest { private Object methodIW
我是一名优秀的程序员,十分优秀!