在代码中,我最近遇到了一段非常糟糕的代码,这些代码基于对对象执行某些操作的类转换。 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这样做(这应该是可以理解的)。 在下面的文章中,我将展示如何测试这种代码,如何重构它以及实际上我对这种代码的看法。
让我们看一下项目结构:
如关于Mocktio的JAXB答复REPOSTS_DEEP_STUBS的帖子所述,在com.blogspot.toomuchcoding.model包中,我们再次使用JAXB编译器生成了JAXB生成的类。 让我们省略对pom.xml文件的讨论,因为它与上一篇文章完全相同。
在com.blogspot.toomuchcoding.adapter包中,我们在JAXB PlayerDetails类上具有适配器,该类提供对Player接口的访问。 有:
CommonPlayerAdapter.java
package com.blogspot.toomuchcoding.adapter;
import com.blogspot.toomuchcoding.model.Player;
import com.blogspot.toomuchcoding.model.PlayerDetails;
/**
* User: mgrzejszczak
* Date: 09.06.13
* Time: 15:42
*/
public class CommonPlayerAdapter implements Player {
private final PlayerDetails playerDetails;
public CommonPlayerAdapter(PlayerDetails playerDetails){
this.playerDetails = playerDetails;
}
@Override
public void run() {
System.out.printf("Run %s. Run!%n", playerDetails.getName());
}
public PlayerDetails getPlayerDetails() {
return playerDetails;
}
}
DefencePlayerAdapter.java
package com.blogspot.toomuchcoding.adapter;
import com.blogspot.toomuchcoding.model.DJ;
import com.blogspot.toomuchcoding.model.DefensivePlayer;
import com.blogspot.toomuchcoding.model.JavaDeveloper;
import com.blogspot.toomuchcoding.model.PlayerDetails;
/**
* User: mgrzejszczak
* Date: 09.06.13
* Time: 15:42
*/
public class DefencePlayerAdapter extends CommonPlayerAdapter implements DefensivePlayer, DJ, JavaDeveloper {
public DefencePlayerAdapter(PlayerDetails playerDetails){
super(playerDetails);
}
@Override
public void defend(){
System.out.printf("Defence! %s. Defence!%n", getPlayerDetails().getName());
}
@Override
public void playSomeMusic() {
System.out.println("Oops I did it again...!");
}
@Override
public void doSomeSeriousCoding() {
System.out.println("System.out.println(\"Hello world\");");
}
}
OffensivePlayerAdapter.java
package com.blogspot.toomuchcoding.adapter;
import com.blogspot.toomuchcoding.model.OffensivePlayer;
import com.blogspot.toomuchcoding.model.PlayerDetails;
/**
* User: mgrzejszczak
* Date: 09.06.13
* Time: 15:42
*/
public class OffensivePlayerAdapter extends CommonPlayerAdapter implements OffensivePlayer {
public OffensivePlayerAdapter(PlayerDetails playerDetails){
super(playerDetails);
}
@Override
public void shoot(){
System.out.printf("%s Shooooot!.%n", getPlayerDetails().getName());
}
}
好的,现在让我们转到更有趣的部分。 让我们假设我们有一个非常简单的玩家工厂:
PlayerFactoryImpl.java
package com.blogspot.toomuchcoding.factory;
import com.blogspot.toomuchcoding.adapter.CommonPlayerAdapter;
import com.blogspot.toomuchcoding.adapter.DefencePlayerAdapter;
import com.blogspot.toomuchcoding.adapter.OffensivePlayerAdapter;
import com.blogspot.toomuchcoding.model.Player;
import com.blogspot.toomuchcoding.model.PlayerDetails;
import com.blogspot.toomuchcoding.model.PositionType;
/**
* User: mgrzejszczak
* Date: 09.06.13
* Time: 15:53
*/
public class PlayerFactoryImpl implements PlayerFactory {
@Override
public Player createPlayer(PositionType positionType) {
PlayerDetails player = createCommonP