如何在Mockito中将复杂对象的方法作为参数存根

时间:2017-08-22 14:27:24

标签: unit-testing mockito

My Class以这种方式看待:

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';
import {Observable} from 'rxjs/Rx';
import { Appointment } from '../models/appointment.model';
import {PersonsService} from './persons.services'

@Injectable()
export class AppointmentService {

private AppointmentUrlGet = 'http://localhost/v0/croissants';
private AppointmentUrlWrite = 'http://localhost/v0/croissant';


public handleError(error: any): Promise<any> {
  console.error('An error occurred', error); // for demo purposes only
  return Promise.reject(error.message || error);
}

  constructor(private http: Http, private personsService: PersonsService) {}


  add30mnTo(date : string){
    var initialdate = (this.datetotimestamp(date) + 1800) * 1000;
    var dateinit = new Date (initialdate)
    var result = dateinit.toISOString();
    return result;
  }
.
.
.
.
}

班级 public class MyClass{ A obj; List<B> Obj1; } public class A{ C obj2; } public class B{ List values; } 中有一个方法addToCart(),如下所示:

MyClassImpl

我正在为 class MyClassImpl{ addToCart(MyClass c, String x, String Y, String Z); } 写一个测试类。我能够将x,y和z的测试值传递给MyClassImpl,但由于c是一个复杂的对象,如何使用值存储此方法?更深层次的设定对我来说是值得的。

1 个答案:

答案 0 :(得分:1)

如果您的测试不依赖于MyClass传递给addToCart()的已填充实例,那么您可以模拟它...

MyClass myClass = Mockito.mock(MyClass.class);
String x = "some x";
String y = "some y";
String y = "some z";

MyClassImpl sut = new MyClassImpl();
sut.addToCart(myClass, x, y, z);

// continue with test assertions ...

只要您addToCart()的使用不关心myClass的内容或行为,此功能就会有效。

但是,如果addToCart()的测试用量对myClass的内容或行为有一些期望,那么您必须传递&#39; MyClass&#34;的实际实例。这是为满足这些期望而建造的。或者,正如您的OP建议的那样,&#34;设置更深层次的价值&#34;是耗时的,也许,你的测试只关心MyClass的某些有限方面,那么你可以使用Mockito来模拟那些有限的方面。例如:

MyClass myClass = Mockito.mock(MyClass.class);
Mockito.when(myClass.getX()).thenReturn("some test specific value"); 
Mockito.when(myClass.doX()).thenThrow(new RuntimeException("some test specific exception");
String x = "some x";
String y = "some y";
String y = "some z";

MyClassImpl sut = new MyClassImpl();
sut.addToCart(myClass, x, y, z);

// continue with test assertions ...

编辑1 :根据您的评论&#34;在addToCart()&#34;中有一个空格检查Myclass对象myclass和myclass.getX()的条件。 ...

X x = Mockito.mock(X.class);
Mockito.when(myClass.getX()).thenReturn(x);

...将确保MyClass.getX()内的addToCart()上的空检查安全通过。当然,传递给myClass的{​​{1}}实例的任何空检查都将安全传递,因为您创建了一个模拟的addToCart()实例并将其传递给MyClass并且实例,显然,不是空的。