Index: trunk/test/unit/org/openstreetmap/josm/data/osm/NoteDataTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/NoteDataTest.java	(revision 18008)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/NoteDataTest.java	(revision 18009)
@@ -3,10 +3,21 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Arrays;
+import java.util.List;
 
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.notes.Note;
+import org.openstreetmap.josm.data.notes.Note.State;
+import org.openstreetmap.josm.data.notes.NoteComment;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -14,4 +25,11 @@
  */
 class NoteDataTest {
+
+    /**
+     * Setup test.
+     */
+    @RegisterExtension
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
 
     /**
@@ -25,3 +43,35 @@
         assertEquals(1, notEmpty.getNotes().size());
     }
+
+    /**
+     * Unit test for {@link NoteData#closeNote}
+     */
+    @Test
+    void testCloseNote_nominal() {
+        Note note = new Note(LatLon.ZERO);
+        note.setState(State.OPEN);
+        assertNull(note.getClosedAt());
+        assertTrue(note.getComments().isEmpty());
+
+        NoteData data = new NoteData(Arrays.asList(note));
+        data.closeNote(note, "foo");
+
+        assertEquals(State.CLOSED, note.getState());
+        assertNotNull(note.getClosedAt());
+        List<NoteComment> comments = note.getComments();
+        assertEquals(1, comments.size());
+        NoteComment comment = comments.get(0);
+        assertEquals("foo", comment.getText());
+        assertEquals(note.getClosedAt(), comment.getCommentTimestamp());
+    }
+
+    /**
+     * Checks that closeNote does not throw NPE on null arguments
+     */
+    @Test
+    void testCloseNote_nullsafe() {
+        assertEquals("Note to close must be in layer",
+                assertThrows(IllegalArgumentException.class,
+                        () -> new NoteData().closeNote(null, null)).getMessage());
+    }
 }
