Jaa*_*ans 6 java testing groovy plugins intellij-idea
有时我需要在我的测试用例中嘲笑相当长的时间来写出POJO.我想知道无论如何我都可以在Intellij(14)中从调试变量数据生成模拟?
作为一个例子,我们有一个类:
public class MyClass{
private String aVariableWithARatherLongName1;
private Double aVariableWithARatherLongName2;
private String aVariableWithARatherLongName3;
private Long aVariableWithARatherLongName4;
private String aVariableWithARatherLongName5;
private Boolean aVariableWithARatherLongName6;
private String aVariableWithARatherLongName7;
private String aVariableWithARatherLongName8;
private String aVariableWithARatherLongName9;
private String aVariableWithARatherLongName10;
private String aVariableWithARatherLongName11;
private String aVariableWithARatherLongName12;
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
在我的调试变量视图中,我将有一个MyClass变量列表:
- myClasses = {ArrayList@0} size = 5
- 0 = {MyClass@1}
- aVariableWithARatherLongName1 = {String} "value 1"
- aVariableWithARatherLongName2 = {Double} 2.0
- aVariableWithARatherLongName3 = {String} "value 1"
...
- 1 = {MyClass@2}
- aVariableWithARatherLongName1 = {String} "value 2"
- aVariableWithARatherLongName2 = {Double} 2.0
- aVariableWithARatherLongName3 = {String} "value 2"
...
+ 2 = {MyClass@3}
+ 3 = {MyClass@4}
+ 4 = {MyClass@5}
Run Code Online (Sandbox Code Playgroud)
然后插件或Intellij将根据所选语言生成类似下面的内容(本例中为Groovy):
def mockedResults(){
[
new MyClass(aVariableWithARatherLongName1: 'value 1', aVariableWithARatherLongName2: 2.0, aVariableWithARatherLongName3: 'value 1', ...),
new MyClass(aVariableWithARatherLongName1: 'value 2', aVariableWithARatherLongName2: 2.0, aVariableWithARatherLongName3: 'value 2', ...),
new MyClass(aVariableWithARatherLongName1: 'value 3', aVariableWithARatherLongName2: 2.0, aVariableWithARatherLongName3: 'value 3', ...),
new MyClass(aVariableWithARatherLongName1: 'value 4', aVariableWithARatherLongName2: 2.0, aVariableWithARatherLongName3: 'value 4', ...),
new MyClass(aVariableWithARatherLongName1: 'value 5', aVariableWithARatherLongName2: 2.0, aVariableWithARatherLongName3: 'value 5', ...),
]
}
Run Code Online (Sandbox Code Playgroud)
Intellij(14)是否可以这样,或者是否有任何插件提供这样的功能?
我不知道有什么方法可以让 intellij 默认执行此操作。所以像下面这样的常规代码应该可以工作。需要做更多的工作才能处理像示例中那样的对象列表。
public class ObjectBuilder {
Object object
private static final Map PREFIXES = [(String.class): "\"", (Integer.class): "", (Boolean.class): "", (Double.class): "", (Long.class): ""]
private static final Map SUFIXES = [(String.class): "\"", (Integer.class): "", (Boolean.class): "", (Double.class): "d", (Long.class): ""]
ObjectBuilder(Object object) {
this.object = object
}
def build() {
List properties = []
object.getClass().getDeclaredFields().each {
if(!it.isSynthetic()) {
String propertyName = it.getName()
properties << "$propertyName: ${PREFIXES.get(it.getType())}${object[propertyName]}${SUFIXES.get(it.getType())}"
}
}
println "new ${object.getClass().getSimpleName()}(${properties.join(", ")})"
}
}
Run Code Online (Sandbox Code Playgroud)
我用以下代码对其进行了测试(借用您的MyClass示例:
MyClass myClass1 = new MyClass()
myClass1.aVariableWithARatherLongName1 = "blah"
myClass1.aVariableWithARatherLongName2 = 2.0d
myClass1.aVariableWithARatherLongName4 = 23105
myClass1.aVariableWithARatherLongName6 = new Boolean(true)
MyClass myClass2 = new MyClass()
myClass2.aVariableWithARatherLongName1 = "other"
myClass2.aVariableWithARatherLongName2 = 4.0d
myClass2.aVariableWithARatherLongName4 = 123
myClass2.aVariableWithARatherLongName6 = new Boolean(false)
new ObjectBuilder(myClass1).build()
new ObjectBuilder(myClass2).build()
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
new MyClass(aVariableWithARatherLongName1: "blah", aVariableWithARatherLongName2: 2.0d, aVariableWithARatherLongName4: 23105, aVariableWithARatherLongName6: true)
new MyClass(aVariableWithARatherLongName1: "other", aVariableWithARatherLongName2: 4.0d, aVariableWithARatherLongName4: 123, aVariableWithARatherLongName6: false)
Run Code Online (Sandbox Code Playgroud)