diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
index f17c59d..4070837 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
@@ -35,7 +35,7 @@
     @Override
     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
 
-    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder(10, 9, 7, 3)
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
             .setLabelsOfRow(1, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p")
             .setMoreKeysOf("q", "1")
             .setMoreKeysOf("w", "2")
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
index 3edf041..127d81a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
@@ -114,7 +114,7 @@
     public static ExpectedKey[] SINGLE_ANGLE_QUOTES_RL = { SAQUOTE_RIGHT, SAQUOTE_LEFT };
 
     // Common symbols keyboard layout.
-    private static final ExpectedKey[][] SYMBOLS_COMMON = new ExpectedKeyboardBuilder(10, 9, 7, 5)
+    private static final ExpectedKey[][] SYMBOLS_COMMON = new ExpectedKeyboardBuilder()
             .setKeysOfRow(1,
                     // U+00B9: "¹" SUPERSCRIPT ONE
                     // U+00BD: "½" VULGAR FRACTION ONE HALF
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
index 2403f0f..7cbd2fb 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
@@ -70,8 +70,7 @@
     };
 
     // Common symbols shifted keyboard layout.
-    private static final ExpectedKey[][] SYMBOLS_SHIFTED_COMMON = new ExpectedKeyboardBuilder(
-            10, 1 /* other_currencies */+ 5, 7, 5)
+    private static final ExpectedKey[][] SYMBOLS_SHIFTED_COMMON = new ExpectedKeyboardBuilder()
             .setKeysOfRow(1,
                     key("~"),
                     // U+0060: "`" GRAVE ACCENT
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
index 682ac20..3365b92 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractKeyboardBuilder.java
@@ -29,7 +29,7 @@
  */
 abstract class AbstractKeyboardBuilder<E> {
     // A building array of rows.
-    private final E[][] mRows;
+    private E[][] mRows;
 
     // Returns an instance of default element.
     abstract E defaultElement();
@@ -42,12 +42,8 @@
      * Construct a builder filled with the default element.
      * @param dimensions the integer array of each row's size.
      */
-    AbstractKeyboardBuilder(final int ... dimensions) {
-        mRows = newArrayOfArray(dimensions.length);
-        for (int rowIndex = 0; rowIndex < dimensions.length; rowIndex++) {
-            mRows[rowIndex] = newArray(dimensions[rowIndex]);
-            Arrays.fill(mRows[rowIndex], defaultElement());
-        }
+    AbstractKeyboardBuilder() {
+        mRows = newArrayOfArray(0);
     }
 
     /**
@@ -102,10 +98,13 @@
      */
     void setRowAt(final int row, final E[] elements) {
         final int rowIndex = row - 1;
-        if (rowIndex < 0 || rowIndex >= mRows.length) {
+        if (rowIndex < 0) {
             throw new RuntimeException("Illegal row number: " + row);
         }
-        mRows[rowIndex] = elements;
+        final E[][] newRows = (rowIndex < mRows.length) ? mRows
+                : Arrays.copyOf(mRows, rowIndex + 1);
+        newRows[rowIndex] = elements;
+        mRows = newRows;
     }
 
     /**
@@ -120,8 +119,11 @@
     void setElementAt(final int row, final int column, final E element, final boolean insert) {
         final E[] elements = getRowAt(row);
         final int columnIndex = column - 1;
+        if (columnIndex < 0) {
+            throw new RuntimeException("Illegal column number: " + column);
+        }
         if (insert) {
-            if (columnIndex < 0 || columnIndex >= elements.length + 1) {
+            if (columnIndex >= elements.length + 1) {
                 throw new RuntimeException("Illegal column number: " + column);
             }
             final E[] newElements = Arrays.copyOf(elements, elements.length + 1);
@@ -134,9 +136,9 @@
             setRowAt(row, newElements);
             return;
         }
-        if (columnIndex < 0 || columnIndex >= elements.length) {
-            throw new RuntimeException("Illegal column number: " + column);
-        }
-        elements[columnIndex] = element;
+        final E[] newElements  = (columnIndex < elements.length) ? elements
+                : Arrays.copyOf(elements, columnIndex + 1);
+        newElements[columnIndex] = element;
+        setRowAt(row, newElements);
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
index 577f43e..050bc4c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/ActualKeyboardBuilder.java
@@ -85,7 +85,7 @@
         for (int rowIndex = 0; rowIndex < dimensions.length; rowIndex++) {
             dimensions[rowIndex] = rows.get(rowIndex).size();
         }
-        final ActualKeyboardBuilder builder = new ActualKeyboardBuilder(dimensions);
+        final ActualKeyboardBuilder builder = new ActualKeyboardBuilder();
 
         for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
             final int row = rowIndex + 1;
@@ -95,10 +95,6 @@
         return builder.build();
     }
 
-    private ActualKeyboardBuilder(final int ... dimensions) {
-        super(dimensions);
-    }
-
     @Override
     Key defaultElement() { return null; }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
index 795bcb2..176e0eb 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/ExpectedKeyboardBuilder.java
@@ -23,8 +23,8 @@
  * This class builds an expected keyboard for unit test.
  */
 public final class ExpectedKeyboardBuilder extends AbstractKeyboardBuilder<ExpectedKey> {
-    public ExpectedKeyboardBuilder(final int ... dimensions) {
-        super(dimensions);
+    public ExpectedKeyboardBuilder() {
+        super();
     }
 
     public ExpectedKeyboardBuilder(final ExpectedKey[][] rows) {
