`
liyixing1
  • 浏览: 959074 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

依赖外部资源时解决方案-----存根

 
阅读更多
package stubbing;

import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class WebClient {
public String getContent(URL url) throws Exception {
StringBuffer content = new StringBuffer();

try {
URLConnection connection = url.openConnection();

connection.setDoInput(true);

InputStream is = connection.getInputStream();

byte[] buffer = new byte[2048];
int count;

while (-1 != (count = is.read(buffer))) {
content.append(new String(buffer, 0, count));
}

return content.toString();
} catch (Exception e) {
throw e;
}
}
}


当对这样的代码进行测试,可能想到的是部署一个服务器,如tomcat服务器,然后测试。

这种方案存在的缺点是:
必须保证外部环境在你之前运行。
测试被分割为了两部分。
难以完成自动化测试。


另一个推荐的方式则是在应用中内嵌一个小型的服务工具,如jetty。
jetty的解压目录如



双击start.jar可以运行

如果要手动启动它的代码就像
public class JettySample {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
Context root = new Context(server, "/");
root.setResourceBase("./pom.xml");
root.setHandler(new ResourceHandler());
server.start();
}
}

如果要再test开始前启动它,可以这么写

package stubbing;

import java.net.MalformedURLException;
import java.net.URL;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TestWebClient {
@Before
public void setUp() {
// 按着刚才的代码启动jee容器
}

@After
public void down() {

}

@Test
public void testGetContent() throws MalformedURLException, Exception {
WebClient client = new WebClient();
String result = client.getContent(new URL("http://localhost:8080/"));
Assert.assertEquals(true,
0 < result.indexOf("<TITLE>Powered By Jetty</TITLE>"));
}
}


更好的例子是手动启动,并且写了一个处理器

package stubbing;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mortbay.jetty.HttpHeaders;
import org.mortbay.jetty.handler.AbstractHandler;
import org.mortbay.util.ByteArrayISO8859Writer;

/**
* 实现一个jetty处理类,输出It works。
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-10-17 下午10:07:11
*/
public class TestGetContentOkHandler extends AbstractHandler {
public void handle(String arg0, HttpServletRequest arg1,
HttpServletResponse arg2, int arg3) throws IOException,
ServletException {
OutputStream out = arg2.getOutputStream();
ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer();
writer.write("It works");
writer.flush();
arg2.setIntHeader(HttpHeaders.CONTENT_LENGTH, writer.size());
writer.writeTo(out);
out.flush();
}

}


package stubbing;

import java.net.MalformedURLException;
import java.net.URL;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;

public class TestWebClient {
@BeforeClass
public void setUp() throws Exception {
Server server = new Server(8080);
Context contentOkContext = new Context(server, "/");
// 设置一个处理器
contentOkContext.setHandler(new TestGetContentOkHandler());
server.setStopAtShutdown(true);
server.start();
}

@AfterClass
public void down() {

}

@Test
public void testGetContent() throws MalformedURLException, Exception {
WebClient client = new WebClient();
String result = client.getContent(new URL("http://localhost:8080/"));
Assert.assertEquals("It works", result);
}
}

另一种方法是自己写一个实现了URL的代码,这个URL处理器只是输出一段话,而不是真正的连接到网络。

import java.net.URL;
import java.net.URLStreamHandlerFactory;
import java.net.URLStreamHandler;
import java.net.URLConnection;
import java.io.IOException;
public class TestWebClient1 {
@BeforeClass
public static void setUp() {
TestWebClient1 t = new TestWebClient1();
URL.setURLStreamHandlerFactory(t.new StubStreamHandlerFactory());
}
private class StubStreamHandlerFactory implements
URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
return new StubHttpURLStreamHandler();
}
}
private class StubHttpURLStreamHandler extends URLStreamHandler {
protected URLConnection openConnection(URL url)
throws IOException {
return new StubHttpURLConnection(url);
}
}
@Test
public void testGetContentOk() throws Exception {
WebClient client = new WebClient();
String result = client.getContent(new URL("http://localhost"));
assertEquals("It works", result);
}
}


import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.io.InputStream;
import java.io.IOException;
import java.io.ByteArrayInputStream;
public class StubHttpURLConnection extends HttpURLConnection {
private boolean isInput = true;
protected StubHttpURLConnection(URL url) {
super(url);
}
public InputStream getInputStream() throws IOException {
if (!isInput) {
throw new ProtocolException(
"Cannot read from URLConnection"
+ " if doInput=false (call setDoInput(true))");
}
ByteArrayInputStream bais = new ByteArrayInputStream(
new String("It works").getBytes());
return bais;
}
public void disconnect() {}
public void connect() throws IOException {}
public boolean usingProxy() {
return false;
}
}
  • 大小: 83.8 KB
分享到:
评论

相关推荐

    wavelink-stubs:Wavelink存根

    在IT行业中,Wavelink是一种专门用于远程终端访问和设备管理的软件解决方案,它优化了企业与各种设备(如工业手持设备、移动计算机和条形码扫描器)之间的通信。"Wavelink存根"指的是为Wavelink软件创建的接口或者...

    cozy-stub:用于舒适应用程序的存根助手

    在IT行业中,存根(Stub)是一种常用的软件开发工具,特别是在进行单元测试或者模拟外部服务交互时。"cozy-stub"是一个专为Cozy-light应用程序的CLI(命令行界面)索引API设计的存根助手。这个工具的目的是帮助...

    软件工程习题200题

    - 运行时错误:执行期间出现问题。 - 语法错误:不符合语言规范。 - **验证方法**: - 单元测试:针对单个模块。 - 集成测试:测试模块间的连接。 - 系统测试:测试整个系统。 #### 三十九、单元测试与集成测试...

    程序设计复习资料

    - 探索解决方案。 - 推荐最佳方案。 - 编写开发计划。 - 提交审查。 9. **软件的特点**: - 抽象性:软件是逻辑实体,不易直接观察。 - 可复制性:复制成本低。 - 不会磨损:不受物理损耗的影响。 - 硬件...

    前端项目-sinon.js.zip

    它可以轻松地与这些框架集成,以构建完整的测试解决方案。 6. **HTTP请求存根** Sinon.js 提供了`sinon-server`模块,可以创建假的HTTP服务器来存根Ajax请求。这在测试涉及网络通信的组件时非常有用,确保测试不...

    C# 进行单元测试实例

    - 使用解决方案资源管理器重命名Class1.cs文件为LogonInfo.cs,并修改其中的构造函数以接受两个字符串参数:userId和password。 2. **生成单元测试** - 右键点击LogonInfo()构造函数,选择“创建测试…”菜单项。...

    xzopen-XZUnitTest-master_java_

    4. Mock对象:在单元测试中,模拟(Mock)和存根(Stub)对象常用来隔离测试,避免依赖外部系统或真实数据库。 5. 断言库:用于验证代码行为是否符合预期,例如`assertEquals`、`assertTrue`等。 6. 结果报告:测试...

    培训教材2—软件单元测试.pptx

    - **复杂依赖**:处理复杂的类或模块依赖关系时,可以使用模拟对象(Mocks)和存根(Stubs)来隔离测试。 - **持续集成**:通过持续集成(CI)工具自动运行单元测试,及时发现并修复问题。 业界数据显示,单元测试...

    org.robokind.impl.motion.dynamixel-0.9.0.zip

    这样的组合使得开发者能够在不依赖外部网络服务的情况下,测试和调试与远程服务器交互的部分。 【标签】"开源项目"表明整个解决方案是开放源代码的,意味着任何人都可以查看、学习、修改和分发代码。这对于开发者...

    sampleIvyPortlet:与 Liferay 插件 SDK 集成的 ivy portlet 存根示例

    5. **Maven 和 Gradle**:Maven 和 Gradle 是更广泛使用的Java项目构建工具,但它们的约定式项目布局可能不适合所有情况,Ivy 提供了更定制化的解决方案。 6. **portlet.xml** 和 **web.xml**:portlet.xml 定义...

    dependency-injection-lib

    综上所述,"dependency-injection-lib"可能是一个专为Java开发的轻量级或全面的依赖注入解决方案,帮助开发者遵循依赖注入原则,提升代码质量,简化系统架构。使用这样的库,开发者可以更专注于业务逻辑,而不是对象...

    sham-it:创建一个Sham(模拟的HTTP服务器)并在JS中模拟端点

    当您需要测试依赖于第三方Web服务的Web服务时,您必须在加载整个平台,创建复杂的存根服务或模拟代码库中调用外部服务的部分之间进行选择。 随着平台大小的增加,尝试一次加载所有平台将使您的集成测试停滞不前。 ...

    AutoFacTest.rar

    1. ASP.NET MVC项目的解决方案文件(.sln) 2. MVC项目的源代码文件夹,包括Controllers、Models、Views等 3. 自定义业务服务的类库项目,包含接口和实现 4. AutoFac配置和注册代码 5. 示例的测试用例,可能使用了...

    Jmockit in Action

    6. **常见问题和解决方案**:面对测试中的挑战,如循环依赖、多线程环境下的模拟等,Jmockit如何应对。 通过深入学习和实践,开发者可以充分利用Jmockit提高测试效率,保证代码质量,降低维护成本。对于从事Java...

    stubgen_c-开源

    这个工具极大地简化了对C代码进行单元测试的过程,因为它自动为程序员生成必要的存根函数,这些函数可以模拟被测试代码依赖的外部功能。在C编程中,单元测试通常需要创建这样的存根,以便在孤立环境中测试特定函数或...

    MockGen:基于源生成器的AC#模拟库

    - 结合其他测试框架:MockGen可以与其他测试框架(如NUnit、xUnit等)结合使用,提供更完整的测试解决方案。 综上所述,MockGen是一个强大的工具,能够帮助C#开发者构建高效的测试环境,提高测试的质量和速度。...

    mms_ui_test_project.rar

    综上所述,"mms_ui_test_project"是一个全面的UI自动化测试解决方案,涵盖了从测试框架的选择、测试设计策略到持续集成和测试报告的各个环节。通过深入研究这个项目,我们可以学习到如何有效地构建和维护一个UI自动...

    vs2005快捷键的使用

    99. **解决方案管理器(Ctrl+W,S)**:显示或隐藏解决方案资源管理器,管理项目结构。 100. **类视图(Ctrl+W,C)**:显示或隐藏类视图窗口,查看项目中类和类型的层次关系。 101. **错误列表(Ctrl+W,E)**:显示或...

Global site tag (gtag.js) - Google Analytics