我正在尝试测试一个带有空数据库/没有从数据库返回任何内容的场景。
我用mockito编写了一个junit4测试类。有一个由Mockito创建的服务类和dao类。一开始,我定义了“when”方法,它起作用了。后来,我试着拉出“when”方法调用,看看会发生什么,反正它起作用了。为什么?
当调用myService.getDistinctObjectList()时,myService类将调用myDao的所有四个方法。所以我想我必须模拟所有四个方法并返回虚拟结果。如果MyDao.someMethod()在未配置时被调用,会发生什么情况?MyDao应该与数据库一起工作,但我没有给它任何东西。
我附上了MyDao和MyService的示例代码以供参考。(我对它们进行了简化,MyDao有四种检索四种对象的方法)
public class MyDaoImpl implements MyDao {
@SuppressWarnings("unused")
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
private String schema;
@ConstructorProperties({ "dataSource", "schema" })
private MyDaoImpl(DataSource dataSource, String schema) {
this.dataSource = dataSource;
this.schema = schema;
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public List<SomeObjectTypeA> listSomeObjectTypeA() {
return this.jdbcTemplate.query("select * from " + schema + ".SOME_TABLE", new RowMapper<SomeObjectTypeA>() {
@Override
public SoftBillAccount mapRow(ResultSet rs, int rowNum) throws SQLException {
String memberA = rs.getString("MEMBER_A");
String memberB = rs.getString("MEMBER_B");
}
});
}
public List<SomeObjectTypeA> listSomeObjectTypeB() {
//omitted
}
public List<SomeObjectTypeA> listSomeObjectTypeC() {
//omitted
}
public List<SomeObjectTypeA> listSomeObjectTypeD() {
//omitted
}
}
public class MyServiceImpl implements MyService {
private MyDao myDao;
public MyServiceImpl(){}
@ConstructorProperties({ "myDao" })
public MyServiceImpl(MyDao myDao) {
this.myDao = myDao;
}
@Override
public List<String> getSomeObjectTypeA_MemberA_Only() {
List<SomeObjectTypeA> list = myDao.listSomeObjectTypeA();
List<String> memberAList = new ArrayList<String>();
for (SomeObjectTypeA objectA : list) {
memberAList.add(objectA.getMemberA());
}
return memberAList;
}
}
public class MyServiceImpl implements MyService {
private MyDao myDao;
public MyServiceImpl(){}
@ConstructorProperties({ "myDao" })
public MyServiceImpl(MyDao myDao) {
this.myDao = myDao;
}
@Override
public List<String> getSomeObjectTypeA_MemberA_Only() {
List<SomeObjectTypeA> list = mydao.listSomeObjectTypeA();
List<String> memberAList = new ArrayList<String>();
for (SomeObjectTypeA objectA : list) {
memberAList.add(objectA.getMemberA());
}
return memberAList;
}
}
这是测试类:
public class Test1{
@InjectMocks
private MyServiceImpl myService;
@Mock
private MyDao myDao;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testEmptyDatabase() {
//ArrayList<SomeObjectTypeA> list = new ArrayList<SomeObjectTypeA>();
//list.add( new SomeObjectTypeA("A","A", "A", "A") );
//when(myDao.listSomeObjectTypeA()).thenReturn( Collections.<SomeObjectTypeA>emptyList() );
//when(myDao.listSomeObjectTypeB()).thenReturn( Collections.<SomeObjectTypeB>emptyList() );
//when(myDao.listSomeObjectTypeC()).thenReturn( Collections.<SomeObjectTypeC>emptyList() );
//when(myDao.listSomeObjectTypeD()).thenReturn( Collections.<SomeObjectTypeD>emptyList() );
List<String> distinctList = myService.getDistinctObjectList(); // myService.getDistinctObjectList() end up calling all four methods of myDao
//Write the List to a file, with a trailer with record count
OutputWriter outputWriter = new OutputWriterImpl(outputFileDir, outputFilePrefix,outputFileSuffix);
try{
outputWriter.writeOutput(distinctList);
}catch(IOException e){
e.printStackTrace();
}
//Create a control file for comparison
try{
BufferedWriter bfr = new BufferedWriter(new FileWriter(compareFileDir+compareFilePrefix+compareFileSuffix));
bfr.write("Trailer|");
bfr.write(String.format("%07d", 0));
bfr.newLine();
bfr.close();
}catch(IOException e){
e.printStackTrace();
}
File file1 = new File(outputFileDir + outputFilePrefix + date + outputFileSuffix);
File file2 = new File(compareFileDir+ compareFilePrefix+compareFileSuffix);
System.out.println(file1.length()); // show 17
System.out.println(file2.length()); // show 17
assertEquals(file1.length(), file2.length());
}
除非您显式地更改模拟的默认行为,否则它将返回“nice values”。对于collection,默认的返回值是空集合,因此您不需要显式地使用when
调用来返回这样的空集合,就像您注释掉的代码所做的那样。
我正在尝试测试一个空数据库/没有从数据库返回任何内容的场景。 我用mockito写了一个junit4测试类。有一个服务类和dao类是由mockito创建的。首先,我定义了“何时”方法,它起作用了。后来,我试着调用“when”方法,看看会发生什么,不管怎样,它工作了。为什么? 当myService.getDistinctObjectList()被调用时,myService类会调用myDao的所有四个
我正在为我的项目创建junit测试用例。我有下面的代码,我想在其中创建一个模拟, 我正在使用jUnit和mockito核心jar。我尝试了下面的代码, 使用上述代码,它在模拟loadProperties方法时抛出错误。如何模拟Spring静态类并返回我的模拟属性对象? 任何帮助都将不胜感激。
我对junit mockito非常陌生,并尝试使用mockito编写junit测试用例。 这是我的方法,我必须为此编写一个jUnit。 ChefService和ChefApi传递的方法参数来自第三方api 这里是呼叫chefService。listCookbookVersions()将返回CookBookVersion类类型的迭代器,如
我需要测试一个服务类,但是当我试图模拟dao类时,它没有被触发,因此不能使用ThenReturn()。 我认为问题是因为我在服务类(Spring MVC 3.1)中为我的Dao和@Autowired使用了一个接口: 接口: 执行情况: 成功了!
我最近为Thymeleaf编写了一个自定义方言以及一个自定义处理器,以处理一些自定义标记,并在某些情况下用不同的标记替换它们,但我在编写处理器测试时遇到了问题: 类需要重写 方法,这是我需要测试的方法。 因为我的处理器涉及从获取变量,所以我尝试模拟它;但是,、和类都声明为final,这意味着它们不能被Mockito模拟。 我真的不想实例化一个实际的对象,因为它依赖于其他5个无法模拟的对象,我最终会
看起来HttpClient及其子类有问题。