如何从intellij中的调试变量值生成模拟?

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)是否可以这样,或者是否有任何插件提供这样的功能?

Jar*_*son 0

我不知道有什么方法可以让 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)