为了获得可重用和可测试的rxjava代码,我使用ObservableTransformers分离了代码的各个部分。它在生产中工作得很好,但是测试它并不像预期的那么容易,因为我似乎无法模拟那些观察到的ransformers。
import io.reactivex.Observable;
import io.reactivex.ObservableTransformer;
import io.reactivex.subjects.PublishSubject;
public class Cut {
private PublishSubject<String> emitter = PublishSubject.create();
private ITransformerProvider transformerProvider;
public Cut(ITransformerProvider transformerProvider) {
this.transformerProvider = transformerProvider;
}
public void writeNewText(String text){
emitter.onNext(text);
}
public Observable<String> getActualText(){
return emitter
.compose(transformerProvider.getObservableTransformer());
}
class MyActualObservableTransformer implements ITransformerProvider {
@Override
public ObservableTransformer<String, String> getObservableTransformer() {
//does something I do not want to execute in unit test, e.g. REST call
return null;
}
}
}
import io.reactivex.ObservableTransformer;
public interface ITransformerProvider {
ObservableTransformer<String, String> getObservableTransformer();
}
public class TextTest {
@Mock
private ITransformerProvider transformerProvider;
@Mock
private ObservableTransformer<String, String> observableTransformer;
private TestObserver<String> testObserver;
private Cut cut;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
when(transformerProvider.getObservableTransformer()).thenReturn(observableTransformer);
when(observableTransformer.apply(any())).thenReturn(Observable.just("mockedText"));
testObserver = new TestObserver<>();
cut = new Cut(transformerProvider);
cut.getActualText()
.observeOn(Schedulers.trampoline())
.subscribe(
newText -> testObserver.onNext(newText)
, error -> Assert.fail(error.getMessage()));
}
@Test
public void testGetActualText(){
cut.writeNewText("ignoredText");
testObserver.assertValueAt(0, text -> text.equals("mockedText"));
}
}
when(observableTransformer.apply(any())).thenreturn(observable.just(“mockedtext”));
一旦调用subscribe for它,它就会发出一个新值,订阅链永远不会完成。所以我的问题是,我如何模拟一个可观察的,而不让它在订阅期间发出值?我想Observable.just或BehaviorSubject并不适合,因为就我仍然有限的RxJava知识而言,它在本例中的行为与预期一致。有什么想法吗?
我想出的最简单的解决方案就是不要用Mockito来嘲笑它,而是自己去嘲笑它:
private ObservableTransformer ObservableTransformer=text->text.map(忽略->“mockedtext”);
我有一个问题与存根我的存储库。有人建议我只创建另一个application.properties(我没有这样做),并使用像H2这样的内存数据库。不过,我想知道我是否可以只是存根调用,这样当调用MyDataService.FindById(id)而不是试图从数据库中获取它时,就可以返回一个模拟对象?
我有一个这样的方法。 > 如果我模拟记录器,是否必须将方法更改为post(字符串json,记录器记录器)?否则,如何使此模拟与该方法交互?
在如何模拟Grails单元测试中使用的自动有线依赖方面,我可以提供一些建议。我省略了大部分不必要的代码,只给出了测试类和被测试文件类中的相关方法 如果不对此依赖性进行攻击或嘲弄,我就会得到错误 我尝试存根密码编码器并让它返回true 但这会给出一条错误消息: 有什么方法可以用Spock来嘲笑这种依赖吗?
问题内容: 我正在使用RestTemplate 方法发布到端点。在我的测试文件中,我正在测试POST方法。但是用我目前的测试,我得到了POST请求。在测试文件中发出POST请求时,我需要模拟API的帮助 这是我的主文件 这是我的测试文件 问题答案: 您正在测试DataTestRepo类内部的逻辑,因此您不应模拟它。RestTemplate是DataTestRepo内部的一个依赖项,因此这正是您需要
问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测