我有一个像这样的对象:
// I want to test this Object
object MyObject {
protected val retryHandler: HttpRequestRetryHandler = new HttpRequestRetryHandler {
def retryRequest(exception: IOException, executionCount: Int, context: HttpContext): Boolean = {
true // implementation
}
}
private val connectionManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager
val httpClient: CloseableHttpClient = HttpClients.custom
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler)
.build
def methodPost = {
//create new context and new Post instance
val post = new HttpPost("url")
val res = httpClient.execute(post, HttpClientContext.create)
// check response code and then take action based on response code
}
def methodPut = {
// same as methodPost except use HttpPut instead HttpPost
}
}
我想通过模拟像httpClient这样的依赖对象来测试这个对象。怎么做到这一点?我可以用Mokito或更好的方式吗?如是。怎么样?这个班级有更好的设计吗?
答案 0 :(得分:0)
您的问题是:您创建了难以测试的代码。您可以转动here观看一些视频,了解原因。
简短的回答:在生产代码中直接调用 new 总是会让测试更加困难。您可能正在使用Mockito间谍(请参阅here了解其工作原理)。
但是:更好的答案是重做你的生产代码;例如,使用依赖注入。含义:不是创建类本身所需的对象(通过使用 new )...您的类从某处接收那些对象。
典型的(java)方法类似于:
public MyClass() { this ( new SomethingINeed() ); }
MyClass(SomethingINeed incoming) { this.somethign = incoming; }
换句话说:正常使用路径仍然直接调用 new ;但是对于单元测试,你提供了一个替代构造函数,你可以用它来注入你所测试的类所依赖的东西。