- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在使用Spring时,生产时应该使用Spring配置xml来实例化你的对象,而在测试时直接实例化对象的理解是否正确?
例如。
MyMain.java
package org.world.hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyMain {
private Room room;
public static void speak(String str)
{
System.out.println(str);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
Room room = (Room) context.getBean("myRoom");
speak(room.generatePoem());
}
}
房间.java
package org.world.hello;
public class Room {
private BottleCounter bottleCounter;
private int numBottles;
public String generatePoem()
{
String str = "";
for (int i = numBottles; i>=0; i--)
{
str = str + bottleCounter.countBottle(i) + "\n";
}
return str;
}
public BottleCounter getBottleCounter() {
return bottleCounter;
}
public void setBottleCounter(BottleCounter bottleCounter) {
this.bottleCounter = bottleCounter;
}
public int getNumBottles() {
return numBottles;
}
public void setNumBottles(int numBottles) {
this.numBottles = numBottles;
}
}
BottleCounter.java
package org.world.hello;
public class BottleCounter {
public String countBottle(int i)
{
return i + " bottles of beer on the wall" + i + " bottles of beer!";
}
}
Beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="myRoom" class="org.world.hello.Room">
<property name="bottleCounter">
<bean id = "myBottleCounter" class = "org.world.hello.BottleCounter"/>
</property>
<property name = "numBottles" value = "10"></property>
</bean>
</beans>
输出:(我为缺少的空间道歉)
10 bottles of beer on the wall10 bottles of beer!
9 bottles of beer on the wall9 bottles of beer!
8 bottles of beer on the wall8 bottles of beer!
7 bottles of beer on the wall7 bottles of beer!
6 bottles of beer on the wall6 bottles of beer!
5 bottles of beer on the wall5 bottles of beer!
4 bottles of beer on the wall4 bottles of beer!
3 bottles of beer on the wall3 bottles of beer!
2 bottles of beer on the wall2 bottles of beer!
1 bottles of beer on the wall1 bottles of beer!
0 bottles of beer on the wall0 bottles of beer!
现在进行测试:
BottleCounterTest.java:
package org.world.hello;
import static org.junit.Assert.*;
import org.junit.Test;
public class BottleCounterTest {
@Test
public void testOneBottle() {
BottleCounter b = new BottleCounter();
assertEquals("1 bottles of beer on the wall1 bottles of beer!", b.countBottle(1));
}
}
非常简单。
房间测试.java:
package org.world.hello;
import static org.junit.Assert.*;
import org.mockito.Mockito;
import org.junit.Test;
public class RoomTest {
@Test
public void testThreeBottlesAreSeperatedByNewLines()
{
Room r = new Room();
BottleCounter b = Mockito.mock(BottleCounter.class);
Mockito.when(b.countBottle(Mockito.anyInt())).thenReturn("a");
r.setBottleCounter(b);
r.setNumBottles(3);
assertEquals("a\na\na\na\n", r.generatePoem());
}
}
我以这种方式实例化我的测试对象是否正确?
最佳答案
内部静态类配置:在测试 Spring 组件时,我们通常使用 @RunWith(SpringJUnit4ClassRunner.class)
并创建我们的类 @ContextConfiguration
。通过创建类 @ContextConfiguration
,您可以创建一个用于配置的内部静态类,您可以在其中完全控制。在那里,您将所有需要的定义为 beans 并在测试中将其定义为 @Autowired
,以及依赖项,这些依赖项可以是模拟对象或常规对象,具体取决于测试用例。
组件扫描生产代码:如果测试需要更多组件,您可以添加 @ComponentScan
但我们尝试让它只扫描它需要的包(这是当您使用 @Component
注释但在您的如果您可以将 XML 添加到 @ContextConfiguration
)。当您不需要模拟并且您有一个需要像生产一样的复杂设置时,这是一个不错的选择。这对于集成测试非常有用,您可以在其中测试组件如何在要测试的功能切片中相互交互。
混合方法:当您有许多需要像生产一样但一两个需要模拟的 bean 时,这是通常的情况。然后你可以 @ComponentScan
生产代码,但添加一个内部静态类,它是 @Configuration
并在那里定义带有注释 @Primary
的 bean,这将覆盖生产测试时该 bean 的代码配置。这很好,因为您不需要为所有已定义的 bean 编写很长的 @Configuration
,您可以扫描所需的内容并覆盖应该模拟的内容。
在你的情况下,我会采用这样的第一种方法:
package org.world.hello;
import static org.junit.Assert.*;
import org.mockito.Mockito;
import org.junit.Test;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class RoomTest {
@Configuration
//@ImportResource(value = {"path/to/resource.xml"}) if you need to load additional xml configuration
static class TestConfig {
@Bean
public BottleCounter bottleCounter() {
return Mockito.mock(BottleCounter.class);
}
@Bean
public Room room(BottleCounter bottleCounter) {
Room room = new Room();
room.setBottleCounter(bottleCounter);
//r.setNumBottles(3); if you need 3 in each test
return room;
}
}
@Autowired
private Room room; //room defined in configuration with mocked bottlecounter
@Test
public void testThreeBottlesAreSeperatedByNewLines()
{
Mockito.when(b.countBottle(Mockito.anyInt())).thenReturn("a");
r.setNumBottles(3);
assertEquals("a\na\na\na\n", r.generatePoem());
}
}
关于java - 使用 Spring 时实例化对象,用于测试与生产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29203218/
我在一个网站上工作,该网站在生产中只有 aspx 文件和 bin 目录和文件。任何人都知道这个网站是如何部署的,我通常有我的网站,我也会提交代码。 我的问题 2. 如何在同一台服务器上创建测试网站?我
您好,我认为这应该是一个相当简单的问题,但我对管理 git 不太熟悉。 我使用的是非常流行的 http://nvie.com/posts/a-successful-git-branching-mode
目前我的网站(生产服务器)已经有很多代码了。现在我想开始在我的项目中使用 Git 并为我的团队设置一个暂存服务器。谁能给我任何建议? 这是我脑海中的画面: Production
我目前正在学习 Erlang SO 用户能否提供有关他们的任何 Erlang 应用程序部署的有趣示例? 我想深入了解 Erlang 在过去的电信中的常见用途,以及 Erlang 在开发/部署过程中带来
我关注了Ryan's screencast并部署到 VPS。所以我使用 Unicorn + nginx + github + Ubuntu 12.04 LTS + capistrano。我也使用 i1
我想在 Azure 中维护临时环境和生产环境。每个都应该有自己的 blob 存储和 sql 存储。实现这一目标的最佳方法是什么?设置临时和生产 SQL Server 以及两个 Blob 存储帐户? 最
我无法使用 Electron 打包程序在内置的 Electron 应用程序中打开chrome开发工具。 我已经尝试过mainWindow.webContents.openDevTools(),但这没有
我有一个 Azure 应用程序服务环境。 可以在同一个 ASE 中运行多个应用服务计划(开发、测试和生产)吗? 基本上,我知道他们会共享前端池,我认为这很好,因为那里没有运行应用程序代码,并且它“..
我是 Maven 新手,有 Rails 背景。在较高级别上,如果我正在运行测试、在本地运行应用程序以及在部署到生产环境时,我希望连接到不同的数据库。 这就是我的想法。当我运行 mvn test 时,它
我有一个 Azure 应用程序服务环境。 可以在同一个 ASE 中运行多个应用服务计划(开发、测试和生产)吗? 基本上,我知道他们会共享前端池,我认为这很好,因为那里没有运行应用程序代码,并且它“..
我正在使用 faSTLane\produce 脚本制作一个新应用程序,我收到以下错误消息: in `parse_response': {"data"=>nil, "messages"=>{"warn"
使开发人员能够构建包含私有(private)数据的系统的当前做法是什么?谁能指出这类事情的“最佳实践”指南? 我们这里有一个 Catch-22,因为开发人员需要编写与具有被认为是“私有(private
我有一个连接 Azure SQL Server 的 Azure 云服务。当我第一次设置这个时,我真的不太了解自己在做什么,只是想熟悉 Azure。所以现在我想利用我所拥有的东西并将其转变为可靠的部署结
我是 Cordova 的新手。抱歉,如果这些是业余问题。我想详细了解典型手机应用程序的设置和架构。 我有一个本地版本的 Meteor Cordova 正在运行,它通过 Modulus 连接到远程服务器
我一直在寻找一些在一些 POS(销售点)设备和服务器之间同步数据的选项。 SymmetricDS似乎是具有商业友好许可证的选项之一。作为一个 Codehaus 项目确实保证了一定程度的质量,所以我同意
在 PHP 开发中,可以通过服务器的“环境”变量确定应用程序是在生产环境还是开发环境中运行。 在 tomcat 服务器上是否有类似的变量可用,或者是否有更好的方法将应用程序用于生产和开发? 最佳答案
我正在做一个项目,我需要使用 TwitterAPI 检索 Twitter 消息,处理它们并将它们存储在数据库中。我正在使用 Producer/Consumer BlockingQueue,其中元素的作
这个问题类似于:iPhone development - what is the difference between a development and distribution provision
我正在尝试根据 URL 在 Drupal 中设置环境。例如,如果我访问 mysite.local,它将使用 localdb 并将站点名称更改为“Local Mysite”;如果我转到 mysite.c
我今天一直在阅读 Magento 中的数据库同步。 我目前正在努力解决的一件事是在开发期间和上传到生产期间需要同步什么。现在假设一批更改将包含对数据库和类似代码的更改,下面是我对模型工作流的理解(我目
我是一名优秀的程序员,十分优秀!