[译]使用Mockito简单mock入门

我们在写单元测试的时候,面临的一个挑战就是要测试的内容总是依赖于其他组件,要是我们还得先配置好其他组件,未免有点不如意,那么我们可以使用Mocks来代替那些依赖的组件 本文问了展示这个过程,我会创建一个DAL,数据访问层,这是一个类,提供了一个通用的api来访问和修改数据仓库的数据,然后,我们要测试这个api,而不用配置连接某个本地的数据库,,或者一个远程的数据库,或者是一个文件系统,反正就是任何放数据的东西,DAL层的好处就是隔离开了数据访问和应用程序代码 首先使用maven来创建一个工程 mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=MockitoDemo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 执行之后,本地生成MockitoDemo 文件夹,然后整个工程的目录结构与生成好了。 然后,我们写这样一个model类,表示book类型 package info.sanaulla.models; import java.util.List; /** * Model class for the book details. */ public class Book { private String isbn; private String title; private List<String> authors; private String publication; private Integer yearOfPublication; private Integer numberOfPages; private String image; public Book(String isbn, String title, List<String> authors, String publication, Integer yearOfPublication, Integer numberOfPages, String image){ this.isbn = isbn; this.title: = title; this. [Read More]

Spring依赖注入

在Spring框架中,依赖注入设计模式主要用来定义对象之间的依赖,存在两种主要类型 1)setter注入(设置器) 2)constructor注入(构造器) 1.Setter注入 是最流行最简单的DI方法,通过一个setter方法来完成依赖。 例子: 一个有一个setter方法的Helper类 package com.mkyong.output; import com.mkyong.output.IOutputGenerator; public class OutputHelper { IOutputGenerator outputGenerator; public void setOutputGenerator(IOutputGenerator outputGenerator){ this.outputGenerator = outputGenerator; } } 再写一个bean配合iwenjianshengming这些bean,并且通过property(属性)标签来设置依赖 <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-2.5.xsd"> &lt;bean id="OutputHelper" class="com.mkyong.output.OutputHelper"&gt; &lt;property name="outputGenerator"&gt; &lt;ref bean="CsvOutputGenerator" /&gt; &lt;/property&gt; &lt;/bean&gt; <bean id=“CsvOutputGenerator” class=“com.mkyong.output.impl.CsvOutputGenerator” /> <bean id=“JsonOutputGenerator” class=“com.mkyong.output.impl.JsonOutputGenerator” /> </beans> 看到了把。我们只需要一个setter方法把CsvOutputGenerator注入进去就行了 2.Constructor注入 这种方式是通过一个构造函数来完成依赖设置的 例子: 一个有着一个构造函数的Helper类 package com.mkyong.output; import com.mkyong.output.IOutputGenerator; public class OutputHelper { IOutputGenerator outputGenerator; OutputHelper(IOutputGenerator outputGenerator){ this.outputGenerator = outputGenerator; } } 然后当然是一个bean配置文件了。通过constructor-arg标签来写依赖 <beans xmlns=“http://www. [Read More]

Spring松耦合示例

面向对象设计的理念是把整个系统分成一组可重用的组件,然而,当系统变得越大的时候,尤其是在java中,这最大的对象依赖将会紧紧耦合,以至于非常难以管理和修改,而现在,你可以使用Spring框架扮演一个中间模块的角色,方便高效地管理其他组件依赖 输出生成的例子 看个例子,假设你的项目有一个方法可以输出内容到csv或者json格式,你可能写出这样的代码 package com.mkyong.output; public interface IOutputGenerator { public void generateOutput(); } ,然后是实现接口的类 package com.mkyong.output.impl; import com.mkyong.output.IOutputGenerator; public class CsvOutputGenerator implements IOutputGenerator { public void generateOutput(){ System.out.println(“Csv Output Generator”); } } 再写个Json生成的类 package com.mkyong.output.impl; import com.mkyong.output.IOutputGenerator; public class JsonOutputGenerator implements IOutputGenerator { public void generateOutput(){ System.out.println(“Json Output Generator”); } } 有好几种方法来调用IOutputGenerator接口,以及我们如何使用Spring来避免对象的过度耦合。 方法1-直接调用 package com.mkyong.common; import com.mkyong.output.IOutputGenerator; import com.mkyong.output.impl.CsvOutputGenerator; public class App { public static void main( String[] args ) { IOutputGenerator output = new CsvOutputGenerator(); output. [Read More]

Spring3实例入门-Hello World

每次看到hello world,都有一种说不出的赶脚,想起了一个程序员,退休后写毛笔字,取笔研磨铺纸,大笔一挥,写下了“hello world”。 1.使用Maven生成项目结构 mvn archetype:generate -DgroupId=com.mkyong.core -DartifactId=Spring3Example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 2.转换成Eclipse项目 mvn eclipse:eclipse 3.添加Spring3.0 依赖 在pom.xml文件里添加Spring 3.0 依赖,然后依赖会从Maven中央仓库自动下载 <project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mkyong.core</groupId> <artifactId>Spring3Example</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Spring3Example</name> <url>http://maven.apache.org</url> &lt;properties&gt; &lt;spring.version&gt;3.0.5.RELEASE&lt;/spring.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!-- Spring 3 dependencies --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-core&lt;/artifactId&gt; &lt;version&gt;${spring.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;${spring.version}&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; </project> 4.Spring bean 写个简单的bean package com.mkyong.core; /** * Spring bean * */ public class HelloWorld { private String name; [Read More]

使用Maven创建Web项目

本文通过Maven完成一个简单的Web项目(注意,Spring配置不是重点,看看就行) 1.从Maven模板创建Web应用程序 命令格式如下: mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false 这就告诉Maven从**maven-archetype-webapp **这个模板来创建 友情提示:是不是太难记了..好吧,直接输入 mvn archetype:generate 根据向导来创建把。。 比如我这样写: > mvn archetype:generate -DgroupId=com.mkyong -DartifactId=CounterWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false [INFO] Scanning for projects… [INFO] [INFO] ———————————————————————— [INFO] Building Maven Stub Project (No POM) 1 [INFO] ———————————————————————— [INFO] [INFO] Generating project in Batch mode [INFO] —————————————————————————- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0 [INFO] —————————————————————————- [INFO] Parameter: groupId, Value: com.mkyong [INFO] Parameter: packageName, Value: com. [Read More]

Maven库依赖机制及添加自定义库

一.Maven库依赖机制 Maven的库依赖机制可以帮助我们自动下载依赖的库文件,并且还能更新版本。。 考虑一个情境来理解机制的工作原理,假设我们要使用Log4J库作为项目的日志记录。以下是我们要做的 1.传统的方式 1)访问Log4J网站http://logging.apache.org/log4j/2.x/ 2)下载Log4J的jar包 3)复制进项目的classpath里 4)手工包含到项目的依赖里 看到没,你要从头做到尾,如果Log4J更新了,你得再来一遍。。 2.Maven的方式 1)需要知道Log4J的Maven坐标(coordinates,这个暂时没想到好名字),就是这样的东西 <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> 然后Maven就会自动下载1.2.14版本的Log4J了。如果version这个元素没有,那么如果有了新版本,Maven会自动下载新版本的。 2)在pom.xml里声明这个Maven坐标 <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies> 3)当Maven编译或者build的时候,Log4J会自动下载,放入本地仓库里 4)Maven全部接管 3.解释 搜索顺序前面说过了。本地-》中央-》远程仓库 Maven坐标咋来的,当然去中央仓库搜索之了,搜索结果清晰的令人发指 二.添加自定义库到本地仓库 有两个情况,需要我们包含自定义的库到本地仓库里 1是你想使用的jar文件不再中央仓库 2是你创建了一个自定义的jar包,需要另一个项目使用这个jar 比如,kaptche,一个第三方的java库,生成验证码,现在中央仓库没有了。 我们想要加到本地仓库里 1.mvn安装 下载kaptche,解压并且拷贝kaptcha-version.jar到其他任何你喜欢的地方,比如c盘,然后输入如下格式的命令 mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar 这里我这样输入 D:&gt;mvn install:install-file -Dfile=c:\kaptcha-2.3.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar [INFO] Scanning for projects… [INFO] Searching repository for plugin with prefix: ‘install’. [INFO] ———————————————————————— [INFO] Building Maven Default Project [INFO] task-segment: install:install-file [INFO] ———————————————————————— [INFO] [install:install-file] [INFO] Installing c:\kaptcha-2. [Read More]

Maven仓库详解

本文由我翻译合并了多篇文章,整理成一篇。 一.本地仓库(Local Repository) 本地仓库就是一个本机的目录,这个目录被用来存储我们项目的所有依赖(插件的jar包还有一些其他的文件),简单的说,当你build一个Maven项目的时候,所有的依赖文件都会放在本地仓库里,仓库供所有项目都可以使用 默认情况下,本地仓库在.m2目录,windows下的话就是你的用户名目录下的.m2目录 1.更新本地仓库目录 找到你的MAVEN_HOME目录下的conf/setting.xml文件,更新localRepository节点 <settings> <!– localRepository | The path to the local repository maven will use to store artifacts. | | Default: ~/.m2/repository <localRepository>/path/to/local/repo</localRepository> –> <localRepository>D:/maven/repo</localRepository> 2.保存一下 完成了。新的本地仓库被放在了D:/maven/repo 看一下这个目录 二.中央仓库(central repository) 当我们build一个Maven项目的时候,Maven会检查我们的pom.xml文件,来定义项目的依赖,然后Maven会在本地仓库里查找,如果没有找到,就去maven的中央库去下载,地址是 http://search.maven.org/#browse 看起来是这样的   注意啊,虽然这个是新的中央仓库,但有时候还是会从_“http://repo1.maven.org/maven/_这个旧仓库下载东西,不过不要紧,理解就行了 三.远程仓库(Remote Respository) 在Maven中,当你在pom.xml中生命的依赖既不在本地库,也不在中央库的时候,就会报错。 1.例子 org.jvnet.localizer这个包仅在java.net的仓库里有(以前是,现在中央仓库也有了。但理解就行) <dependency> <groupId>org.jvnet.localizer</groupId> <artifactId>localizer</artifactId> <version>1.8</version> </dependency> 当我们build的时候,会失败,并输出未找到错误信息 2.声明java.net仓库 为了告诉Maven从远程仓库里获取依赖,我们需要声明一个远程仓库,在pom.xml里这样写 <repositories> <repository> <id>java.net</id> <url>https://maven.java.net/content/repositories/public/</url> </repository> </repositories> 这样,Maven搜索依赖的顺序就是: 1)搜索本地仓库,没有找到,就去第2步,否则退出 2)搜索中央仓库,没有找到,就去第3步,否则退出 3)去java.net远程仓库获取,没有找到,就报错,否则退出 补充:JBoss也有个远程仓库,可以如下配置: <project …> <repositories> <repository> <id>JBoss repository</id> <url>http://repository. [Read More]
java  maven  翻译 

Maven安装教程

Maven不需要作为服务组件安装到windows上,仅仅需要下载,解压,然后配置一下环境变量就行了

1.JDK和JAVA_HOME

确保JDK已经安装,同时JAVA_HOME变量已经添加到了windows环境变量里,指向jdk目录

maven-java-home

 

2.下载Maven

Maven主页,选个版本,点击下载

3.解压

解压下载的zip文件,重命名,比如我放到D盘的Maven目录

4.添加MAVEN_HOME环境变量

添加一个新的环境变量MAVEN_HOME到环境变量,指向Maven目录

maven-maven-home

 

5.添加path变量

更新Path变量,把Maven的bin目录添加进去,这样就可以在任何地方执行mvn命令了

Maven-Path

 

6.验证

打开命令行,输入

mvn -version
如果看到类似下面的
C:\Documents and Settings\mkyong>mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-07 03:16:01+0800)
Java version: 1.6.0_13
Java home: C:\Program Files\Java\jdk1.6.0_13\jre
Default locale: en_US, platform encoding: Cp1252
OS name: “windows xp” version: “5.1” arch: “x86” Family: “windows”
Maven已经成功的安装配置了。

老外写的太详细了。。。

 

Maven实例入门-随机数生成

看了很多个例子,发现这个最好,译文中会带有我的一些了理解,有问题欢迎指出。 0.Maven是什么? Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 可以看到,核心就是项目管理和自动构建了,从例子中将会体会更深。本例创建一个随机数生成程序。 1.从Maven模板创建项目 Maven的环境变量配置和java类似,直接添加系统变量MAVEN_HOME指向你下载的maven目录,然后将bin目录添加到path环境变量里。 在命令行下,进入到你想存储项目的位置,比如,我自己有个叫work的目录,那么我就cd到work目录,然后按下面的格式输入命令 mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 这是告诉Maven从**maven-archetype-quickstart **创建一个java项目,如果你这个参数不填,那么会列出一个列表,让你选择你想创建什么类型,比如web项目啊,啥的。 友情提示:是不是太难记了..好吧,直接输入 mvn archetype:generate 根据向导来创建把。。 比如 >mvn archetype:generate -DgroupId=com.mkyong -DartifactId=NumberGenerator -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false [INFO] Scanning for projects… [INFO] [INFO] – omitted for readability [INFO] —————————————————————————- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] —————————————————————————- [INFO] Parameter: groupId, Value: com.mkyong [INFO] Parameter: packageName, Value: com.mkyong [INFO] Parameter: package, Value: com.mkyong [INFO] Parameter: artifactId, Value: NumberGenerator [INFO] Parameter: basedir, Value: /Users/mkyong/Documents/workspace [INFO] Parameter: version, Value: 1. [Read More]

[译]反射(Reflection)和动态(dynamic)

反射   当我们需要检查,调用一个程序集的内容的时候,用反射,比如,当VS给智能提示的时候,就应用了反射。 简单用法实例:   var myAssembly = Assembly.LoadFile(@“C:\ClassLibrary1.dll”); var myType = myAssembly.GetType(“ClassLibrary1.Class1”); dynamic objMyClass = Activator.CreateInstance(myType); // 获取类的类型信息 Type parameterType = objMyClass.GetType(); // 浏览方法 foreach (MemberInfo objMemberInfo in parameterType.GetMembers()) {Console.WriteLine(objMemberInfo.Name);} // 浏览属性. foreach (PropertyInfo objPropertyInfo in parameterType.GetProperties()) {Console.WriteLine(objPropertyInfo.Name);} //开始调用 parameterType.InvokeMember(“Display”,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance,null, objMyClass, null); 实际一点的用处呢:   1.当你也要开发一个类似VS的编辑器的时候,要提供智能提示就需要反射 2.当创建单元测试框架的时候,为了测试需要动态调用方法和属性的时候 3.有时候我们想把类型的属性,方法等全部导出的时候 动态dynamic   编程语言分为强/弱类型,dynamic是弱类型,此关键字会让编译器不做编译时的类型检查,只做运行时的检查。 简单用法示例:   dynamic x = “c#”; x++; 所以上面这行代码可以编译通过,但会产生运行时一场。 [Read More]